From 08114e56bdeb805894b21f06529c9a5e6072b622 Mon Sep 17 00:00:00 2001 From: Maxim Zhiburt Date: Fri, 28 Feb 2025 01:00:39 +0300 Subject: [PATCH 1/2] Add new rename_all options ['Upper Title Case', 'lower title case'] --- tabled/Cargo.toml | 2 +- tabled/examples/derive/rename_all.rs | 2 +- tabled_derive/src/casing_style.rs | 36 ++++++++++++++++++++-------- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/tabled/Cargo.toml b/tabled/Cargo.toml index 4ae6a7cc..5b4f0781 100644 --- a/tabled/Cargo.toml +++ b/tabled/Cargo.toml @@ -337,7 +337,7 @@ macros = ["std"] [dependencies] papergrid = { version = "0.14", default-features = false } -tabled_derive = { version = "0.10", optional = true } +tabled_derive = { path = "../tabled_derive", optional = true } ansi-str = { version = "0.9", optional = true } ansitok = { version = "0.3", optional = true } diff --git a/tabled/examples/derive/rename_all.rs b/tabled/examples/derive/rename_all.rs index 8997244b..7329b64a 100644 --- a/tabled/examples/derive/rename_all.rs +++ b/tabled/examples/derive/rename_all.rs @@ -14,7 +14,7 @@ use tabled::{Table, Tabled}; #[derive(Tabled)] -#[tabled(rename_all = "camelCase")] +#[tabled(rename_all = "UPPERCASE")] struct Country { name: String, #[tabled(rename_all = "kebab-case")] diff --git a/tabled_derive/src/casing_style.rs b/tabled_derive/src/casing_style.rs index 3a5f0123..17989c8a 100644 --- a/tabled_derive/src/casing_style.rs +++ b/tabled_derive/src/casing_style.rs @@ -17,6 +17,10 @@ pub enum CasingStyle { Lower, /// Keep all letters uppercase and remove word boundaries. Upper, + /// Split string by words and start each with upper latter. + UpperTitle, + /// Split string by words. + LowerTitle, /// Use the original attribute name defined in the code. Verbatim, } @@ -36,23 +40,35 @@ impl CasingStyle { "snake" | "snakecase" => Ok(Snake), "lower" | "lowercase" => Ok(Lower), "upper" | "uppercase" => Ok(Upper), + "uppertitle" | "uppertitlecase" => Ok(UpperTitle), + "lowertitle" | "lowertitlecase" => Ok(LowerTitle), "verbatim" | "verbatimcase" => Ok(Verbatim), - _ => Err(Error::new(format!("unsupported casing: `{:?}`", name.value()), name.span(), Some("supported values are ['camelCase', 'kebab-case', 'PascalCase', 'SCREAMING_SNAKE_CASE', 'snake_case', 'lowercase', 'UPPERCASE', 'verbatim']".to_owned()))) + _ => { + const SUPPORTED: &str = "supported values are ['camelCase', 'kebab-case', 'PascalCase', 'SCREAMING_SNAKE_CASE', 'snake_case', 'lowercase', 'UPPERCASE', 'lower title case', 'Upper Title Case', 'verbatim']"; + + Err(Error::new( + format!("unsupported casing: `{:?}`", name.value()), + name.span(), + Some(SUPPORTED.to_owned()), + )) + } } } - pub fn cast(self, s: String) -> String { + pub fn cast(self, text: String) -> String { use CasingStyle::*; match self { - Pascal => heck::ToUpperCamelCase::to_upper_camel_case(s.as_str()), - Camel => heck::ToLowerCamelCase::to_lower_camel_case(s.as_str()), - Kebab => heck::ToKebabCase::to_kebab_case(s.as_str()), - Snake => heck::ToSnakeCase::to_snake_case(s.as_str()), - ScreamingSnake => heck::ToShoutySnakeCase::to_shouty_snake_case(s.as_str()), - Lower => heck::ToSnakeCase::to_snake_case(s.as_str()).replace('_', ""), - Upper => heck::ToShoutySnakeCase::to_shouty_snake_case(s.as_str()).replace('_', ""), - Verbatim => s, + Pascal => heck::ToUpperCamelCase::to_upper_camel_case(text.as_str()), + Camel => heck::ToLowerCamelCase::to_lower_camel_case(text.as_str()), + Kebab => heck::ToKebabCase::to_kebab_case(text.as_str()), + Snake => heck::ToSnakeCase::to_snake_case(text.as_str()), + ScreamingSnake => heck::ToShoutySnakeCase::to_shouty_snake_case(text.as_str()), + Lower => heck::ToSnakeCase::to_snake_case(text.as_str()).replace('_', ""), + Upper => heck::ToShoutySnakeCase::to_shouty_snake_case(text.as_str()).replace('_', ""), + LowerTitle => heck::ToSnakeCase::to_snake_case(text.as_str()).replace('_', " "), + UpperTitle => heck::ToTitleCase::to_title_case(text.as_str()), + Verbatim => text, } } } From 39ae790edfed35e09427ceb4a0c3827f580a26e7 Mon Sep 17 00:00:00 2001 From: Maxim Zhiburt Date: Fri, 28 Feb 2025 01:03:18 +0300 Subject: [PATCH 2/2] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ae5521ed..ae73566a 100644 --- a/README.md +++ b/README.md @@ -1487,8 +1487,8 @@ struct Person { ### Format headers -Beside `#[tabled(rename = "")]` you can change a format of a column name using -`#[tabled(rename_all = "UPPERCASE")]`. +Using `#[tabled(rename_all = "")]` you can change a format of a column name. +Supported values are [`camelCase`, `kebab-case`, `PascalCase`, `SCREAMING_SNAKE_CASE`, `snake_case`, `lowercase`, `UPPERCASE`, `lower title case`, `Upper Title Case`, `verbatim`] ```rust use tabled::Tabled; @@ -1499,7 +1499,7 @@ struct Person { id: u8, number: &'static str, name: &'static str, - #[tabled(rename_all = "snake_case")] + #[tabled(rename_all = "UPPERCASE")] middle_name: &'static str, } ```