#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum KeyFoldingMode {
#[default]
Off,
Safe,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum PathExpansionMode {
#[default]
Off,
Safe,
}
pub fn is_identifier_segment(s: &str) -> bool {
if s.is_empty() {
return false;
}
let mut chars = s.chars();
let first = match chars.next() {
Some(c) => c,
None => return false,
};
if !first.is_alphabetic() && first != '_' {
return false;
}
chars.all(|c| c.is_alphanumeric() || c == '_')
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_key_folding_mode_default() {
assert_eq!(KeyFoldingMode::default(), KeyFoldingMode::Off);
}
#[test]
fn test_path_expansion_mode_default() {
assert_eq!(PathExpansionMode::default(), PathExpansionMode::Off);
}
#[test]
fn test_is_identifier_segment() {
assert!(is_identifier_segment("a"));
assert!(is_identifier_segment("_private"));
assert!(is_identifier_segment("userName"));
assert!(is_identifier_segment("user_name"));
assert!(is_identifier_segment("user123"));
assert!(is_identifier_segment("_123"));
assert!(!is_identifier_segment(""));
assert!(!is_identifier_segment("123"));
assert!(!is_identifier_segment("user-name"));
assert!(!is_identifier_segment("user.name")); assert!(!is_identifier_segment("user name")); assert!(!is_identifier_segment("user:name")); assert!(!is_identifier_segment(".name")); }
#[test]
fn test_identifier_segment_vs_general_key() {
assert!(!is_identifier_segment("a.b")); assert!(!is_identifier_segment("a.b.c"));
assert!(is_identifier_segment("abc"));
assert!(is_identifier_segment("_private"));
assert!(is_identifier_segment("key123"));
}
}