sqlm-postgres-macros 0.1.0

macros for `sqlm-postgres`
Documentation
use std::str::FromStr;
use std::{error, fmt};

use heck::{
    ToKebabCase, ToLowerCamelCase, ToShoutyKebabCase, ToShoutySnakeCase, ToSnakeCase, ToTrainCase,
    ToUpperCamelCase,
};

#[derive(Clone, Copy, PartialEq, Eq)]
#[allow(clippy::enum_variant_names)]
pub enum RenameAll {
    CamelCase,
    KebabCase,
    LowerCase,
    PascalCase,
    ScreamingKebabCase,
    ScreamingSnakeCase,
    SnakeCase,
    TrainCase,
    UpperCase,
}

impl RenameAll {
    pub fn apply(&self, name: &str) -> String {
        match self {
            RenameAll::CamelCase => name.to_lower_camel_case(),
            RenameAll::KebabCase => name.to_kebab_case(),
            RenameAll::LowerCase => name.to_lowercase(),
            RenameAll::PascalCase => name.to_upper_camel_case(),
            RenameAll::ScreamingKebabCase => name.to_shouty_kebab_case(),
            RenameAll::ScreamingSnakeCase => name.to_shouty_snake_case(),
            RenameAll::SnakeCase => name.to_snake_case(),
            RenameAll::TrainCase => name.to_train_case(),
            RenameAll::UpperCase => name.to_uppercase(),
        }
    }
}

impl FromStr for RenameAll {
    type Err = InvalidCase;

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

#[derive(Debug)]
pub struct InvalidCase(());

impl error::Error for InvalidCase {}

impl fmt::Display for InvalidCase {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.write_str("invalid case conversion")
    }
}