Skip to content

fix: Add AsRef<str> impl for unnamed enums#4478

Open
udayprakash wants to merge 3 commits intosmithy-lang:mainfrom
udayprakash:fix-unnamed-enum-asref
Open

fix: Add AsRef<str> impl for unnamed enums#4478
udayprakash wants to merge 3 commits intosmithy-lang:mainfrom
udayprakash:fix-unnamed-enum-asref

Conversation

@udayprakash
Copy link
Contributor

Motivation and Context

Unnamed enums (newtype string wrappers like pub struct Foo(String)) were missing the AsRef<str> implementation that named enums have. This caused compilation errors when using unnamed enums with APIs that require AsRef<str>, such as aws_smithy_http::query::fmt_string().

Description

  • Add impl AsRef<str> to renderUnnamedEnum() in EnumGenerator.kt to match the behavior of named enums
  • Change impl<T> From<T> where T: AsRef<str> to impl From<&str> in ClientEnumGenerator.kt to avoid conflicting impl error (E0119) when the type itself implements AsRef<str>

Testing

The fix was validated by building Coral-to-Smithy generated Rust clients that use unnamed enums.

Checklist

  • I have updated CHANGELOG.next.toml if I made changes to the smithy-rs codegen or runtime crates
  • I have updated CHANGELOG.next.toml if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Unnamed enums (newtype string wrappers like `pub struct Foo(String)`)
were missing the `AsRef<str>` implementation that named enums have.
This caused compilation errors when using unnamed enums with APIs that
require `AsRef<str>`, such as `aws_smithy_http::query::fmt_string()`.

Changes:
- Add `impl AsRef<str>` to `renderUnnamedEnum()` in EnumGenerator.kt
- Change `impl<T> From<T> where T: AsRef<str>` to `impl From<&str>` in
  ClientEnumGenerator.kt to avoid conflicting impl error (E0119) when
  the type itself implements `AsRef<str>`
@udayprakash udayprakash requested review from a team as code owners January 13, 2026 02:01
Add tests to verify that unnamed enums correctly implement AsRef<str>:

- EnumGeneratorTest: Test that unnamed enums can be used with AsRef<str>
- ClientEnumGeneratorTest: Test the same for client-generated enums

These tests verify the fix that adds impl AsRef<str> to unnamed enums.
Copy link
Contributor

@aajtodd aajtodd left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will have to give this more thought.

writable {
rustTemplate(
"""
impl<T> #{From}<T> for ${context.enumName} where T: #{AsRef}<str> {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would be a breaking change.

Also see #3886

udayprakash pushed a commit to udayprakash/smithy-rs that referenced this pull request Jan 15, 2026
Add test cases for enum-related codegen issues:

- SpecialCharacterEnum: Enum values containing # characters that conflict
  with rustTemplate formatting (see PR smithy-lang#4476)
- UnnamedEnum: Unnamed enums that need AsRef<str> implementation
  (see issue smithy-lang#3886, PR smithy-lang#4478)

These tests currently fail, demonstrating the bugs that need to be fixed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants