automorph-derive 0.2.0

Derive macros for automorph - Automerge-Rust struct synchronization
Documentation
//! Case conversion utilities for rename_all attribute.

/// Rule for renaming fields/variants.
#[derive(Clone, Copy)]
#[allow(clippy::enum_variant_names)]
pub(crate) enum RenameRule {
    CamelCase,
    SnakeCase,
    PascalCase,
    ScreamingSnakeCase,
    KebabCase,
}

impl RenameRule {
    /// Apply the rename rule to a string.
    pub(crate) fn apply(&self, s: &str) -> String {
        match self {
            RenameRule::CamelCase => to_camel_case(s),
            RenameRule::SnakeCase => to_snake_case(s),
            RenameRule::PascalCase => to_pascal_case(s),
            RenameRule::ScreamingSnakeCase => to_snake_case(s).to_uppercase(),
            RenameRule::KebabCase => to_snake_case(s).replace('_', "-"),
        }
    }
}

/// Convert a string to camelCase.
pub(crate) fn to_camel_case(s: &str) -> String {
    let mut result = String::new();
    let mut capitalize_next = false;
    for c in s.chars() {
        if c == '_' {
            capitalize_next = true;
        } else if capitalize_next {
            result.extend(c.to_uppercase());
            capitalize_next = false;
        } else {
            result.push(c);
        }
    }
    result
}

/// Convert a string to snake_case.
pub(crate) fn to_snake_case(s: &str) -> String {
    let mut result = String::new();
    for (i, c) in s.chars().enumerate() {
        if c.is_uppercase() && i > 0 {
            result.push('_');
        }
        result.extend(c.to_lowercase());
    }
    result
}

/// Convert a string to PascalCase.
pub(crate) fn to_pascal_case(s: &str) -> String {
    let mut result = String::new();
    let mut capitalize_next = true;
    for c in s.chars() {
        if c == '_' {
            capitalize_next = true;
        } else if capitalize_next {
            result.extend(c.to_uppercase());
            capitalize_next = false;
        } else {
            result.push(c);
        }
    }
    result
}