benzina-derive 0.3.2

Various helper macros for `diesel`
Documentation
use std::str::FromStr;

use heck::{
    ToKebabCase as _, ToLowerCamelCase as _, ToPascalCase as _, ToShoutyKebabCase,
    ToShoutySnakeCase as _, ToSnakeCase as _,
};

#[derive(Copy, Clone)]
pub(crate) enum RenameRule {
    None,
    LowerCase,
    SnakeCase,
    UpperCase,
    PascalCase,
    CamelCase,
    ScreamingSnakeCase,
    KebabCase,
    ScreamingKebabCase,
}

impl RenameRule {
    pub(crate) fn format(self, val: &str) -> String {
        match self {
            Self::None => val.to_owned(),
            Self::LowerCase => val.to_lowercase(),
            Self::UpperCase => val.to_uppercase(),
            Self::PascalCase => val.to_pascal_case(),
            Self::CamelCase => val.to_lower_camel_case(),
            Self::SnakeCase => val.to_snake_case(),
            Self::ScreamingSnakeCase => val.to_shouty_snake_case(),
            Self::KebabCase => val.to_kebab_case(),
            Self::ScreamingKebabCase => val.to_shouty_kebab_case(),
        }
    }
}

impl FromStr for RenameRule {
    type Err = String;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "lowercase" => Ok(Self::LowerCase),
            "UPPERCASE" => Ok(Self::UpperCase),
            "PascalCase" => Ok(Self::PascalCase),
            "camelCase" => Ok(Self::CamelCase),
            "snake_case" => Ok(Self::SnakeCase),
            "SCREAMING_SNAKE_CASE" => Ok(Self::ScreamingSnakeCase),
            "kebab-case" => Ok(Self::KebabCase),
            "SCREAMING-KEBAB-CASE" => Ok(Self::ScreamingKebabCase),
            _ => Err("invalid rename rule".to_owned()),
        }
    }
}