google-cloud-derive 0.2.1

Derive macros for the `google-cloud` library
Documentation
use crate::RenameAll;

pub(crate) fn transform_variant_casing(variant: syn::Ident, rename_all: RenameAll) -> String {
    match rename_all {
        RenameAll::LowerCase => variant.to_string().to_ascii_lowercase(),
        RenameAll::UpperCase => variant.to_string().to_ascii_uppercase(),
        RenameAll::CamelCase => {
            let variant = variant.to_string();
            variant[..1].to_ascii_lowercase() + &variant[1..]
        }
        RenameAll::PascalCase => variant.to_string(),
        RenameAll::SnakeCase => {
            let variant = variant.to_string();
            let mut snake = String::new();
            for (i, ch) in variant.char_indices() {
                if i > 0 && ch.is_uppercase() {
                    snake.push('_');
                }
                snake.push(ch.to_ascii_lowercase());
            }
            snake
        }
        RenameAll::ScreamingSnakeCase => {
            transform_variant_casing(variant, RenameAll::SnakeCase).to_ascii_uppercase()
        }
        RenameAll::KebabCase => {
            transform_variant_casing(variant, RenameAll::SnakeCase).replace('_', "-")
        }
        RenameAll::ScreamingKebabCase => {
            transform_variant_casing(variant, RenameAll::ScreamingSnakeCase).replace('_', "-")
        }
    }
}

pub(crate) fn transform_field_casing(field: syn::Ident, rename_all: RenameAll) -> String {
    match rename_all {
        RenameAll::LowerCase => field.to_string(),
        RenameAll::UpperCase => field.to_string().to_ascii_uppercase(),
        RenameAll::CamelCase => {
            let pascal = transform_field_casing(field, RenameAll::PascalCase);
            pascal[..1].to_ascii_lowercase() + &pascal[1..]
        }
        RenameAll::PascalCase => {
            let field = field.to_string();
            let mut pascal = String::new();
            let mut capitalize = true;
            for ch in field.chars() {
                if ch == '_' {
                    capitalize = true;
                } else if capitalize {
                    pascal.push(ch.to_ascii_uppercase());
                    capitalize = false;
                } else {
                    pascal.push(ch);
                }
            }
            pascal
        }
        RenameAll::SnakeCase => field.to_string(),
        RenameAll::ScreamingSnakeCase => field.to_string().to_ascii_uppercase(),
        RenameAll::KebabCase => field.to_string().replace('_', "-"),
        RenameAll::ScreamingKebabCase => {
            transform_field_casing(field, RenameAll::ScreamingSnakeCase).replace('_', "-")
        }
    }
}