nene 0.7.0

Google Cloud Spanner ORM generator.
Documentation
use convert_case::{Case, Casing};
use handlebars::handlebars_helper;
use handlebars::Handlebars;

fn rust_type_helper(spanner_type: String) -> String {
    let should_wrap_array = spanner_type.starts_with("ARRAY");
    let spanner_type = if should_wrap_array {
        spanner_type.replace("ARRAY<", "").replace('>', "")
    } else {
        spanner_type
    };

    let v = if spanner_type == "BOOL" {
        "bool"
    } else if spanner_type == "DATE" {
        "time::Date"
    } else if spanner_type == "TIMESTAMP" {
        "time::OffsetDateTime"
    } else if spanner_type == "FLOAT64" {
        "f64"
    } else if spanner_type == "NUMERIC" {
        "google_cloud_spanner::bigdecimal::BigDecimal"
    } else if spanner_type.starts_with("BYTES") {
        "Vec<u8>"
    } else if spanner_type == "INT64" {
        "i64"
    } else {
        "String"
    };
    if should_wrap_array {
        return format!("Vec<{}>", v);
    }
    v.to_string()
}

fn rust_default_helper(nullable: bool, spanner_type: String) -> String {
    if !nullable {
        if spanner_type == "DATE" {
            return "time::OffsetDateTime::now_utc().date()".to_string();
        } else if spanner_type == "TIMESTAMP" {
            return "time::OffsetDateTime::now_utc()".to_string();
        }
    }
    "Default::default()".to_string()
}

fn rust_arg_type_helper(v: String) -> String {
    format!("&{}", v.replace("String", "str"))
}

fn rust_caller_type_helper(v: String) -> String {
    v.replace('<', "::<")
}

fn snake_helper(v: String) -> String {
    v.to_case(Case::Snake)
}

fn upper_snake_helper(v: String) -> String {
    v.to_case(Case::UpperSnake)
}

handlebars_helper!(rust_type: |v: String | rust_type_helper(v));
handlebars_helper!(rust_arg_type: |v: String | rust_arg_type_helper(v));
handlebars_helper!(rust_caller_type: |v: String | rust_caller_type_helper(v));
handlebars_helper!(snake: |v: String | snake_helper(v));
handlebars_helper!(upper_snake: |v: String | upper_snake_helper(v));
handlebars_helper!(rust_default: |n: bool, v: String | rust_default_helper(n, v));

pub fn register(handlebars: &mut Handlebars) {
    handlebars.register_helper("rust_type", Box::new(rust_type));
    handlebars.register_helper("rust_arg_type", Box::new(rust_arg_type));
    handlebars.register_helper("rust_caller_type", Box::new(rust_caller_type));
    handlebars.register_helper("snake", Box::new(snake));
    handlebars.register_helper("upper_snake", Box::new(upper_snake));
    handlebars.register_helper("rust_default", Box::new(rust_default));
}