diff --git a/CHANGELOG.md b/CHANGELOG.md index 5230b874..c58c69a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,14 @@ # master + ### Breaking + ### Features + - Add support for `#[ts(type = "..")]` directly on structs and enums ([#286](https://github.com/Aleph-Alpha/ts-rs/pull/286)) + ### Fixes +Fix `#[ts(rename_all_fields = "...")]` on enums containing tuple or unit variants ([#287](https://github.com/Aleph-Alpha/ts-rs/pull/287)) # 8.1.0 diff --git a/macros/src/attr/variant.rs b/macros/src/attr/variant.rs index c6db337c..cca95326 100644 --- a/macros/src/attr/variant.rs +++ b/macros/src/attr/variant.rs @@ -21,9 +21,14 @@ pub struct SerdeVariantAttr(VariantAttr); impl VariantAttr { pub fn new(attrs: &[Attribute], enum_attr: &EnumAttr) -> Result { + let mut result = Self::from_attrs(attrs)?; + result.rename_all = result.rename_all.or(enum_attr.rename_all_fields); + Ok(result) + } + + pub fn from_attrs(attrs: &[Attribute]) -> Result { let mut result = Self::default(); parse_attrs(attrs)?.for_each(|a| result.merge(a)); - result.rename_all = result.rename_all.or(enum_attr.rename_all_fields); #[cfg(feature = "serde-compat")] if !result.skip { crate::utils::parse_serde_attrs::(attrs) diff --git a/macros/src/types/enum.rs b/macros/src/types/enum.rs index a205ce24..afaa8a17 100644 --- a/macros/src/types/enum.rs +++ b/macros/src/types/enum.rs @@ -76,7 +76,14 @@ fn format_variant( variant: &Variant, ) -> syn::Result<()> { let crate_rename = enum_attr.crate_rename(); - let variant_attr = VariantAttr::new(&variant.attrs, enum_attr)?; + + // If `variant.fields` is not a `Fields::Named(_)` the `rename_all_fields` + // attribute must be ignored to prevent a `rename_all` from getting to + // the newtype, tuple or unit formatting, which would cause an error + let variant_attr = match variant.fields { + Fields::Unit | Fields::Unnamed(_) => VariantAttr::from_attrs(&variant.attrs)?, + Fields::Named(_) => VariantAttr::new(&variant.attrs, enum_attr)?, + }; if variant_attr.skip { return Ok(()); diff --git a/ts-rs/tests/enum_struct_rename_all.rs b/ts-rs/tests/enum_struct_rename_all.rs index bbc798fd..b43edcbc 100644 --- a/ts-rs/tests/enum_struct_rename_all.rs +++ b/ts-rs/tests/enum_struct_rename_all.rs @@ -44,12 +44,16 @@ pub enum TaskStatus2 { stdout: String, stderr: String, }, + + A(i32), + B(i32, i32), + C, } #[test] pub fn enum_struct_rename_all_fields() { assert_eq!( TaskStatus2::inline(), - r#"{ "Running": { "started-time": string, } } | { "Terminated": { status: number, stdout: string, stderr: string, } }"# + r#"{ "Running": { "started-time": string, } } | { "Terminated": { status: number, stdout: string, stderr: string, } } | { "A": number } | { "B": [number, number] } | "C""# ) }