genify 0.0.5

Turn one file into a complete project
Documentation
use convert_case::{Case, Casing};
use tera::{Filter, Kwargs, State, Tera, TeraResult};

pub fn register_all(tera: &mut Tera) {
    tera.register_filter("pascal_case", PascalCaseFilter);
    tera.register_filter("camel_case", CamelCaseFilter);
    tera.register_filter("kebab_case", KebabCaseFilter);
    tera.register_filter("snake_case", SnakeCaseFilter);
    tera.register_filter("title_case", TitleCaseFilter);
    tera.register_filter("flat_case", FlatCaseFilter);
    tera.register_filter("cobol_case", CobolCaseFilter);
    tera.register_filter("train_case", TrainCaseFilter);
}

struct PascalCaseFilter;

impl Filter<String, TeraResult<String>> for PascalCaseFilter {
    fn call(&self, value: String, _kwargs: Kwargs, _state: &State) -> TeraResult<String> {
        Ok(value.to_case(Case::Pascal))
    }

    fn is_safe(&self) -> bool {
        false
    }
}

struct CamelCaseFilter;

impl Filter<String, TeraResult<String>> for CamelCaseFilter {
    fn call(&self, value: String, _kwargs: Kwargs, _state: &State) -> TeraResult<String> {
        Ok(value.to_case(Case::Camel))
    }

    fn is_safe(&self) -> bool {
        false
    }
}

struct KebabCaseFilter;

impl Filter<String, TeraResult<String>> for KebabCaseFilter {
    fn call(&self, value: String, _kwargs: Kwargs, _state: &State) -> TeraResult<String> {
        Ok(value.to_case(Case::Kebab))
    }

    fn is_safe(&self) -> bool {
        false
    }
}

struct SnakeCaseFilter;

impl Filter<String, TeraResult<String>> for SnakeCaseFilter {
    fn call(&self, value: String, _kwargs: Kwargs, _state: &State) -> TeraResult<String> {
        Ok(value.to_case(Case::Snake))
    }

    fn is_safe(&self) -> bool {
        false
    }
}

struct TitleCaseFilter;

impl Filter<String, TeraResult<String>> for TitleCaseFilter {
    fn call(&self, value: String, _kwargs: Kwargs, _state: &State) -> TeraResult<String> {
        Ok(value.to_case(Case::Title))
    }

    fn is_safe(&self) -> bool {
        false
    }
}

struct FlatCaseFilter;

impl Filter<String, TeraResult<String>> for FlatCaseFilter {
    fn call(&self, value: String, _kwargs: Kwargs, _state: &State) -> TeraResult<String> {
        Ok(value.to_case(Case::Flat))
    }

    fn is_safe(&self) -> bool {
        false
    }
}

struct CobolCaseFilter;

impl Filter<String, TeraResult<String>> for CobolCaseFilter {
    fn call(&self, value: String, _kwargs: Kwargs, _state: &State) -> TeraResult<String> {
        Ok(value.to_case(Case::Cobol))
    }

    fn is_safe(&self) -> bool {
        false
    }
}

struct TrainCaseFilter;

impl Filter<String, TeraResult<String>> for TrainCaseFilter {
    fn call(&self, value: String, _kwargs: Kwargs, _state: &State) -> TeraResult<String> {
        Ok(value.to_case(Case::Train))
    }

    fn is_safe(&self) -> bool {
        false
    }
}

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

    use super::*;

    #[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, false)
            .expect("String should be rendered");

        assert_eq!(expected, result)
    }
}