export-type 0.1.15

Export Rust types to other languages
Documentation
use convert_case::{Case, Casing};

#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum RenameRule {
    CamelCase,
    PascalCase,
    SnakeCase,
    ScreamingSnakeCase,
    KebabCase,
}

impl RenameRule {
    pub fn from_str(s: &str) -> Option<Self> {
        match s {
            "camelCase" => Some(Self::CamelCase),
            "PascalCase" => Some(Self::PascalCase),
            "snake_case" => Some(Self::SnakeCase),
            "SCREAMING_SNAKE_CASE" => Some(Self::ScreamingSnakeCase),
            "kebab-case" => Some(Self::KebabCase),
            _ => None,
        }
    }

    pub fn apply(&self, name: &str) -> String {
        match self {
            Self::CamelCase => name.to_case(Case::Camel),
            Self::PascalCase => name.to_case(Case::Pascal),
            Self::SnakeCase => name.to_case(Case::Snake),
            Self::ScreamingSnakeCase => name.to_case(Case::ScreamingSnake),
            Self::KebabCase => name.to_case(Case::Kebab),
        }
    }
}

impl From<RenameRule> for String {
    fn from(rule: RenameRule) -> Self {
        rule.apply("")
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_case_conversions() {
        let test_cases = vec![
            (
                "user_id", "userId", "UserId", "user_id", "USER_ID", "user-id",
            ),
            (
                "UserName",
                "userName",
                "UserName",
                "user_name",
                "USER_NAME",
                "user-name",
            ),
            ("ID", "id", "Id", "id", "ID", "id"),
            (
                "HTTPResponse",
                "httpResponse",
                "HttpResponse",
                "http_response",
                "HTTP_RESPONSE",
                "http-response",
            ),
        ];

        for (input, camel, pascal, snake, screaming, kebab) in test_cases {
            assert_eq!(RenameRule::CamelCase.apply(input), camel);
            assert_eq!(RenameRule::PascalCase.apply(input), pascal);
            assert_eq!(RenameRule::SnakeCase.apply(input), snake);
            assert_eq!(RenameRule::ScreamingSnakeCase.apply(input), screaming);
            assert_eq!(RenameRule::KebabCase.apply(input), kebab);
        }
    }
}