| Crates.io | convert_case |
| lib.rs | convert_case |
| version | 0.10.0 |
| created_at | 2020-04-17 00:48:33.26747+00 |
| updated_at | 2025-11-23 12:24:56.780847+00 |
| description | Convert strings into any case |
| homepage | |
| repository | https://github.com/rutrum/convert-case |
| max_upload_size | |
| id | 231014 |
| size | 97,909 |
Converts to and from various cases.
convert_caseConvert case is written in Rust and is ready to be used inline with your rust code as a library.
use convert_case::ccase;
assert_eq!(
ccase!(camel, "My_Var_Name"),
"myVarName",
);
assert_eq!(
ccase!(snake, "IOStream"),
"io_stream",
);
assert_eq!(
ccase!(snake -> title, "2020-04-16_family_photo"),
"2020-04-16 Family Photo",
);
You can read the API documentation on docs.rs for a list of all features and read lots of examples.
This is list of cases that convert_case provides out of the box. You can always make your own custom case.
| Case | Example |
|---|---|
| Snake | my_variable_name |
| Constant UpperSnake |
MY_VARIABLE_NAME |
| Ada | My_Variable_Name |
| Kebab | my-variable-name |
| Cobol UpperKebab |
MY-VARIABLE-NAME |
| Train | My-Variable-Name |
| Flat | myvariablename |
| UpperFlat | MYVARIABLENAME |
| Pascal UpperCamel |
MyVariableName |
| Camel | myVariableName |
| Upper | MY VARIABLE NAME |
| Lower | my variable name |
| Title | My Variable Name |
| Sentence | My variable name |
ccaseThe command line utility ccase was made to expose the tools of the convert_case library to the command line.
$ ccase -t title super_mario_64
Super Mario 64
$ ccase -f snake -t title 2020-04-15_my_cat
2020-04-16 My Cat
$ ccase -t camel "convert to camel"
convertToCamel
convert_case_extrasSome cases and utilies that didn't feel appropriate in this library are made available in a distinct crate called convert_case_extras. This crate is a demonstration of what can be built on top of the convert_case API.
convert_case |
convert_case_extras |
ccase |
|
|---|---|---|---|
| Repository | github | github | github |
| Crate | crates.io | crates.io | crates.io |
| Documentation | docs.rs | docs.rs |
Since the library is so extensible with its new API, there is no longer a need for some niche or fun transformations to be made available in this library. Some of the features that are removed are now in a new library convert_case_extras. That library will have a lower threshold on what is included (i.e. more features), and will also serve as a demonstration of what's capable with the convert_case API.
Removed:
Case::Toggle and Pattern::ToggleCase::Alternating and Pattern::AlternatingCase::Random and Pattern::RandomCase::PseudoRandom and Pattern::PseudoRandomrandom feature is removed. The library no longer has any features.Case::deterministic_cases is removedCase::random_cases is removedOther breaking changes:
Boundary::Custom has lost the arg parameter and Boundary::Custom.condition is more simply fn(&[&str]) -> bool.
arg was originally used for building boundaries from delimiters with the Boundary::from_delim function, which is also removed becausedelim_boundary! macro has replaced Boundary::from_delim functionality, without the need of the arg parametersCasing::with_boundaries is now Casing::set_boundaries and Casing::without_boundaries is now Casing::remove_boundaries to align with ConverterThis release is trying to finalize the API for a 1.0.0 release. In hindsight, making Pattern a function and Boundary a struct were poor decisions. While trying to add customized behavior, I made it harder to use. Luckily, by following the convention that was done with Case in 0.8.0, which was providing a struct-variant Case::Custom, I can keep the new customization options while reverting back to the enum pattern the library has had since the beginning.
If you are updating from before 0.7.0, I don't think any changes are necessary. If you're coming from 0.7.0 or higher,
Boundary::UPPER_SNAKE into Boundary::UpperSnakePattern: pattern::lowercase into Pattern::LowercaseMost excitingly, I've introduced a brand new way to use the crate for 99% of use cases, which is the default behavior out of the box to just convert a string to a case, with no modifications to behavior. Instead of
use convert_case::{Case, Casing};
"MyVarName".to_case(Case::Snake);
"my-var name".from_case(Case::Title).to_case(Case::Snake);
You can use the ccase! macro:
use convert_case::ccase;
ccase!(snake, "MyVarName");
ccase!(title -> snake, "my-var name");
This means only one import and its invocation is brief and easy to read. This is now the first thing you see when viewing the docs, which themselves have gotten a huge overhaul and many improvements in this version.
New features:
ccase! macro that performs case conversion on a string without needing to import Case or Casing. It has two forms:
ccase!(snake, "string") is equivalent to "string".to_case(Case::Snake)ccase!(kebab -> snake, "string") is equivalent to "string".from_case(Case::Kebab).to_case(Case::Snake)case! macro returns a Case variant from the snake case version of the variant. For instance, case!(snake) is substituted for Case::Snake and case!(upper_flat) for Case::UpperFlat.Other breaking changes:
Boundary is reverted back to being an enum, but with a Custom variant that gives all the same flexibility that Boundary had as a struct. This aligns with the Case::Custom pattern.
Boundary.match will return true if a set of graphemes matches the boundary conditionBoundary methods for start and len describe how enum variants consume letters when matchedPattern is reverted back to being an enum, but with a Custom variant that allowed you to pass your own fn (&[&str]) -> Vec<String> as input.
Pattern.mutate will perform the associated mutation functionConverter.with_boundaries has been renamed to Converter.set_boundaries.Converter.remove_delim and Converter.remove_pattern. You can use set_delim("") and set_pattern(Pattern::Noop) instead.ToString is no longer a required trait for using is_caseword_pattern module has been removedPattern is no longer an enum. It is now a type alias for fn(&[&str]) -> Vec<String>. The variants of Pattern can now be referenced as functions inside the pattern module. For upgrading this means changing Pattern::Lowercase to pattern::lowercase, and calling the function directly instead of invoking the mutate method on the enum.
Inside the pattern module is also the type alias Pattern itself.
Other breaking changes:
Case::Ada (capital pattern with underscore delimiter.)Case::Custom variant. It is a struct variant that takes three parameters:
Pattern&static str, and&'static [Boundary].pattern::noop function, Converter attribute pattern is now of type Pattern and not Option<Pattern>Case::deterministic_cases, Case::all_cases, and Case::random_cases now return static arrays instead of vecsOther changes:
Case::split, Case::mutate, and Case::join which expose operations related to the boundaries, pattern, and delimiter of a caseno_std compatibleBoundary is no longer an enum. It now is a struct, and each enum variant cooresponds to an associated constant. For upgrading this just means changing Boundary::LowerUpper to just Boundary::LOWER_UPPER.
The benefit of this is that you can make your boundary conditions now, by instantiating the Boundary struct, or using Boundary::from_delim(). Now you can split on newlines, periods, double-colons, emojis, or a more complex case like a symbol followed by a digit. You also define which characters, if any, are removed during segmentation, and where the split happens.
Changes from this feature:
Boundary::PascalName enum variants now much refered to as Boundary::CONSTANT_NAME constants.Boundary::defaults(), Boundary::digit_letter(), etc) now are const and return fixed-sized arrays [Boundary; N], not Vec<Boundary>.Boundary::all() was removed, since there's no longer a sense of "all" boundaries, since you can create your own.Boundary::list_from() has been renamed to Boundary::defaults_from() and no longer outputs Boundary::UPPER_LOWER, since this function now only checks default boundaries.Boundary::from_delim().Other breaking changes:
Case::ScreamingSnake to Case::Constant.Case::Sentence (sentence pattern and space delimiter.)Casing trait implemented for Arc<str> and Rc<str> again.Other changes:
str::chars in favor of graphemes from unicode-segmentation.