Skip to content

Commit

Permalink
Merge pull request #503 from zhiburt/patch/add-upper-tittle-case
Browse files Browse the repository at this point in the history
tabled_derive/ Add `Upper Tittle Case` and `lower title case` options for `rename_all` attribute
  • Loading branch information
zhiburt authored Feb 27, 2025
2 parents dd52238 + 39ae790 commit 2882319
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 15 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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,
}
```
Expand Down
2 changes: 1 addition & 1 deletion tabled/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }

Expand Down
2 changes: 1 addition & 1 deletion tabled/examples/derive/rename_all.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
Expand Down
36 changes: 26 additions & 10 deletions tabled_derive/src/casing_style.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
Expand All @@ -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,
}
}
}

0 comments on commit 2882319

Please sign in to comment.