cgp-component-macro-lib 0.3.0

Context-generic programming core component macros implemented as a library.
Documentation
use alloc::string::{String, ToString};

use proc_macro2::Span;
use syn::Ident;

pub fn to_snake_case_str(val: &str) -> String {
    let mut acc = String::new();
    let mut prev = '_';

    for ch in val.chars() {
        if ch.is_uppercase() && prev != '_' {
            acc.push('_');
        }
        acc.push(ch);
        prev = ch;
    }

    acc.to_lowercase()
}

pub fn to_snake_case_ident(val: &Ident) -> Ident {
    Ident::new(&to_snake_case_str(&val.to_string()), Span::call_site())
}