fix: support non-ascii characters in case conversion

This commit is contained in:
Ryo Yoshida 2023-02-03 18:11:11 +09:00
parent 04850a192c
commit 98c8077495
No known key found for this signature in database
GPG key ID: E25698A930586171
2 changed files with 11 additions and 5 deletions

View file

@ -2,9 +2,9 @@
#![warn(rust_2018_idioms, unused_lifetimes, semicolon_in_expressions_from_macros)]
use std::io as sio;
use std::process::Command;
use std::{cmp::Ordering, ops, time::Instant};
use std::{io as sio, iter};
mod macros;
pub mod hash;
@ -39,15 +39,19 @@ Uncomment `default = [ "backtrace" ]` in `crates/stdx/Cargo.toml`.
}
pub fn to_lower_snake_case(s: &str) -> String {
to_snake_case(s, char::to_ascii_lowercase)
to_snake_case(s, char::to_lowercase)
}
pub fn to_upper_snake_case(s: &str) -> String {
to_snake_case(s, char::to_ascii_uppercase)
to_snake_case(s, char::to_uppercase)
}
// Code partially taken from rust/compiler/rustc_lint/src/nonstandard_style.rs
// commit: 9626f2b
fn to_snake_case<F: Fn(&char) -> char>(mut s: &str, change_case: F) -> String {
fn to_snake_case<F, I>(mut s: &str, change_case: F) -> String
where
F: Fn(char) -> I,
I: Iterator<Item = char>,
{
let mut words = vec![];
// Preserve leading underscores
@ -75,7 +79,7 @@ fn to_snake_case<F: Fn(&char) -> char>(mut s: &str, change_case: F) -> String {
}
last_upper = ch.is_uppercase();
buf.extend(iter::once(change_case(&ch)));
buf.extend(change_case(ch));
}
words.push(buf);