elastic-mapping-macro 0.1.0

Procedural macros for elastic-mapping - generate Elasticsearch mappings from Rust types
Documentation
use convert_case::{Case, Casing};
use darling::FromMeta;

/// Serde rename_all casing options
#[derive(Debug, FromMeta, Clone, Copy)]
pub(crate) enum RenameCasing {
    #[darling(rename = "lowercase")]
    Lowercase,
    #[darling(rename = "UPPERCASE")]
    UpperCase,
    #[darling(rename = "PascalCase")]
    PascalCase,
    #[darling(rename = "camelCase")]
    CamelCase,
    #[darling(rename = "snake_case")]
    SnakeCase,
    #[darling(rename = "SCREAMING_SNAKE_CASE")]
    ScreamingSnakeCase,
    #[darling(rename = "kebab-case")]
    KebabCase,
    #[darling(rename = "SCREAMING-KEBAB-CASE")]
    ScreamingKebabCase,
}

impl From<RenameCasing> for Case<'_> {
    fn from(value: RenameCasing) -> Self {
        match value {
            RenameCasing::Lowercase => Case::Lower,
            RenameCasing::UpperCase => Case::Upper,
            RenameCasing::PascalCase => Case::Pascal,
            RenameCasing::CamelCase => Case::Camel,
            RenameCasing::SnakeCase => Case::Snake,
            RenameCasing::ScreamingSnakeCase => Case::UpperSnake,
            RenameCasing::KebabCase => Case::Kebab,
            RenameCasing::ScreamingKebabCase => Case::UpperKebab,
        }
    }
}

/// Applies a rename casing to a string identifier
pub(crate) fn apply_rename_casing(s: &str, casing: Option<RenameCasing>) -> String {
    casing
        .map(|case| s.to_case(case.into()))
        .unwrap_or_else(|| s.to_string())
}