From e4d920f300937e1828b7282e546e645b3d818a95 Mon Sep 17 00:00:00 2001 From: AskSkivdal Date: Fri, 12 Dec 2025 18:44:06 +0100 Subject: [PATCH] feat: Honor serde rename and serde skip --- src/to_typescript/structs.rs | 13 +++++++++++-- test/issue-42-serde-rename/rust.rs | 8 ++++++++ test/issue-42-serde-rename/tsync.sh | 8 ++++++++ test/issue-42-serde-rename/typescript.d.ts | 6 ++++++ test/issue-42-serde-rename/typescript.ts | 6 ++++++ test/test_all.sh | 1 + 6 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 test/issue-42-serde-rename/rust.rs create mode 100755 test/issue-42-serde-rename/tsync.sh create mode 100644 test/issue-42-serde-rename/typescript.d.ts create mode 100644 test/issue-42-serde-rename/typescript.ts diff --git a/src/to_typescript/structs.rs b/src/to_typescript/structs.rs index 34d0cf5..c8bd9e7 100644 --- a/src/to_typescript/structs.rs +++ b/src/to_typescript/structs.rs @@ -98,14 +98,23 @@ pub fn process_fields<'a>( // Check if the field has the serde flatten attribute, if so, skip it let has_flatten_attr = utils::get_attribute_arg("serde", "flatten", &field.attrs).is_some(); - if has_flatten_attr { + let serde_skip = utils::get_attribute_arg("serde", "skip", &field.attrs).is_some(); + let serde_rename = utils::get_attribute_arg("serde", "rename", &field.attrs); + if has_flatten_attr || serde_skip { continue; } let comments = utils::get_comments(field.attrs); state.write_comments(&comments, 2); - let field_name = if let Some(name_case) = case { + + let field_name = if let Some(field_name) = serde_rename { + if field_name.contains(" ") { + format!("\"{field_name}\"") + } else { + field_name + } + } else if let Some(name_case) = case { field .ident .map(|id| id.unraw().to_string().to_case(name_case)) diff --git a/test/issue-42-serde-rename/rust.rs b/test/issue-42-serde-rename/rust.rs new file mode 100644 index 0000000..a0c0b4e --- /dev/null +++ b/test/issue-42-serde-rename/rust.rs @@ -0,0 +1,8 @@ +#[tsync] +struct TestThingey { + #[serde(rename = "im_correct ")] + not_me: String, + how_bout_me: String, + #[serde(skip)] + skip_me: SuperSecretStructThatsInternal, +} diff --git a/test/issue-42-serde-rename/tsync.sh b/test/issue-42-serde-rename/tsync.sh new file mode 100755 index 0000000..1764bd6 --- /dev/null +++ b/test/issue-42-serde-rename/tsync.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +cd $SCRIPT_DIR + +cargo run -- -i rust.rs -o typescript.d.ts +cargo run -- -i rust.rs -o typescript.ts \ No newline at end of file diff --git a/test/issue-42-serde-rename/typescript.d.ts b/test/issue-42-serde-rename/typescript.d.ts new file mode 100644 index 0000000..c8d1d9c --- /dev/null +++ b/test/issue-42-serde-rename/typescript.d.ts @@ -0,0 +1,6 @@ +/* This file is generated and managed by tsync */ + +interface TestThingey { + "im_correct ": string; + how_bout_me: string; +} diff --git a/test/issue-42-serde-rename/typescript.ts b/test/issue-42-serde-rename/typescript.ts new file mode 100644 index 0000000..baf6985 --- /dev/null +++ b/test/issue-42-serde-rename/typescript.ts @@ -0,0 +1,6 @@ +/* This file is generated and managed by tsync */ + +export interface TestThingey { + "im_correct ": string; + how_bout_me: string; +} diff --git a/test/test_all.sh b/test/test_all.sh index ab4571b..d3156b6 100755 --- a/test/test_all.sh +++ b/test/test_all.sh @@ -14,6 +14,7 @@ cd $SCRIPT_DIR ./enum_numeric/tsync.sh ./doc_comments/tsync.sh ./generic/tsync.sh +./issue-42-serde-rename/tsync.sh ./issue-43/tsync.sh ./issue-55/tsync.sh ./issue-58/tsync.sh