genify 0.0.4

Turn one file into a complete project
Documentation
use convert_case::{Case, Casing};
use std::{collections::HashMap, hash::BuildHasher};
use tera::{Result, Tera, Value, to_value, try_get_value};

pub fn register_all(tera: &mut Tera) {
    tera.register_filter("pascal_case", pascal_case);
    tera.register_filter("camel_case", camel_case);
    tera.register_filter("kebab_case", kebab_case);
    tera.register_filter("snake_case", snake_case);
    tera.register_filter("title_case", title_case);
    tera.register_filter("flat_case", flat_case);
    tera.register_filter("cobol_case", cobol_case);
    tera.register_filter("train_case", train_case);
}

fn pascal_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
    let s = try_get_value!("pascal_case", "value", String, value);
    Ok(to_value(s.to_case(Case::Pascal)).unwrap())
}

fn camel_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
    let s = try_get_value!("camel_case", "value", String, value);
    Ok(to_value(s.to_case(Case::Camel)).unwrap())
}

fn kebab_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
    let s = try_get_value!("kebab_case", "value", String, value);
    Ok(to_value(s.to_case(Case::Kebab)).unwrap())
}

fn snake_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
    let s = try_get_value!("snake_case", "value", String, value);
    Ok(to_value(s.to_case(Case::Snake)).unwrap())
}

fn title_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
    let s = try_get_value!("title_case", "value", String, value);
    Ok(to_value(s.to_case(Case::Title)).unwrap())
}

fn flat_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
    let s = try_get_value!("flat_case", "value", String, value);
    Ok(to_value(s.to_case(Case::Flat)).unwrap())
}

fn cobol_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
    let s = try_get_value!("cobol_case", "value", String, value);
    Ok(to_value(s.to_case(Case::Cobol)).unwrap())
}

fn train_case<S: BuildHasher>(value: &Value, _: &HashMap<String, Value, S>) -> Result<Value> {
    let s = try_get_value!("train_case", "value", String, value);
    Ok(to_value(s.to_case(Case::Train)).unwrap())
}

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

    #[test]
    fn test() {
        let mut tera = Tera::default();
        register_all(&mut tera);

        let context = Context::new();

        let input = [
            "{{ 'some text' | pascal_case }}",
            "{{ 'some text' | camel_case }}",
            "{{ 'some text' | kebab_case }}",
            "{{ 'some text' | snake_case }}",
            "{{ 'some text' | title_case }}",
            "{{ 'some text' | flat_case }}",
            "{{ 'some text' | cobol_case }}",
            "{{ 'some text' | train_case }}",
        ]
        .join("\n");
        let expected = [
            "SomeText",
            "someText",
            "some-text",
            "some_text",
            "Some Text",
            "sometext",
            "SOME-TEXT",
            "Some-Text",
        ]
        .join("\n");

        let result = tera
            .render_str(input.as_str(), &context)
            .expect("String should be rendered");

        assert_eq!(expected, result)
    }
}