From 778f4d035108755eb6b6dcd1c50b117eef94c96c Mon Sep 17 00:00:00 2001 From: Gustavo Date: Thu, 21 Dec 2023 15:38:44 -0300 Subject: [PATCH 1/2] Make clippy happy --- ts-rs/tests/generics.rs | 1 + ts-rs/tests/union_with_internal_tag.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ts-rs/tests/generics.rs b/ts-rs/tests/generics.rs index c7ce9b6bc..5dad9853b 100644 --- a/ts-rs/tests/generics.rs +++ b/ts-rs/tests/generics.rs @@ -1,3 +1,4 @@ +#![allow(clippy::box_collection)] #![allow(dead_code)] use std::{ diff --git a/ts-rs/tests/union_with_internal_tag.rs b/ts-rs/tests/union_with_internal_tag.rs index e0fc0b74e..e7382ee6f 100644 --- a/ts-rs/tests/union_with_internal_tag.rs +++ b/ts-rs/tests/union_with_internal_tag.rs @@ -1,4 +1,4 @@ -#![allow(dead_code, clippy::blacklisted_name)] +#![allow(dead_code, clippy::disallowed_names)] use serde::Serialize; use ts_rs::TS; From 96ebbb4cd5add28c73777a4384fc3a2be135cef2 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Thu, 21 Dec 2023 15:39:09 -0300 Subject: [PATCH 2/2] Make PascalCase and camelCase behave like in serde --- macros/src/attr/mod.rs | 24 ++++++++++++++++++++++-- ts-rs/tests/struct_rename.rs | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/macros/src/attr/mod.rs b/macros/src/attr/mod.rs index dc566ff18..b9575c10e 100644 --- a/macros/src/attr/mod.rs +++ b/macros/src/attr/mod.rs @@ -32,9 +32,29 @@ impl Inflection { match self { Inflection::Lower => string.to_lowercase(), Inflection::Upper => string.to_uppercase(), - Inflection::Camel => string.to_camel_case(), + Inflection::Camel => { + let pascal = Inflection::apply(Inflection::Pascal, string); + pascal[..1].to_ascii_lowercase() + &pascal[1..] + } Inflection::Snake => string.to_snake_case(), - Inflection::Pascal => string.to_pascal_case(), + Inflection::Pascal => { + let mut s = String::with_capacity(string.len()); + + let mut capitalize = true; + for c in string.chars() { + if c == '_' { + capitalize = true; + continue; + } else if capitalize { + s.push(c.to_ascii_uppercase()); + capitalize = false; + } else { + s.push(c.to_ascii_lowercase()) + } + } + + s + } Inflection::ScreamingSnake => string.to_screaming_snake_case(), Inflection::Kebab => string.to_kebab_case(), } diff --git a/ts-rs/tests/struct_rename.rs b/ts-rs/tests/struct_rename.rs index 12039d05d..e242c5b2a 100644 --- a/ts-rs/tests/struct_rename.rs +++ b/ts-rs/tests/struct_rename.rs @@ -14,6 +14,30 @@ fn rename_all() { assert_eq!(Rename::inline(), "{ A: number, B: number, }"); } +#[test] +fn rename_all_camel_case() { + #[derive(TS)] + #[ts(rename_all = "camelCase")] + struct Rename { + crc32c_hash: i32, + b: i32, + } + + assert_eq!(Rename::inline(), "{ crc32cHash: number, b: number, }"); +} + +#[test] +fn rename_all_pascal_case() { + #[derive(TS)] + #[ts(rename_all = "PascalCase")] + struct Rename { + crc32c_hash: i32, + b: i32, + } + + assert_eq!(Rename::inline(), "{ Crc32cHash: number, B: number, }"); +} + #[cfg(feature = "serde-compat")] #[test] fn serde_rename_special_char() {