df-fields 0.1.16

This is a shortcut tool related to database fields
Documentation
use json::{JsonValue, object};

pub mod str;
pub mod int;
pub mod text;
pub mod float;
pub mod select;
pub mod datetime;

pub trait Field {
    fn sql(&mut self, model: &str) -> String;
    fn field(&mut self) -> JsonValue;
    /// 验证方法
    fn verify(&mut self, data: JsonValue) -> JsonValue {
        data
    }
}

/// 解析数据
pub fn field(model: &str, field: &str, data: JsonValue) -> String {
    let mut row = format!("");
    let mode = data["mode"].as_str().unwrap();
    let require = data["require"].as_bool().unwrap_or(false);
    let title = data["title"].as_str().unwrap_or("未知标题");
    match mode {
        "autokey" => {
            row = int::AutoKey::new(true, field.clone(), title.clone()).sql(model);
        }
        "key" => {
            let length = data["length"].as_i32().unwrap();
            row = str::Key::new(true, field.clone(), title.clone(), length.clone()).sql(model);
        }
        "pass" => {
            let default = data["def"].as_str().unwrap();
            let length = data["length"].as_i32().unwrap();
            row = str::Pass::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql(model);
        }
        "string" => {
            let default = data["def"].as_str().unwrap_or("");
            let length = data["length"].as_i32().unwrap_or(20);
            row = str::Str::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql(model);
        }
        "color" => {
            let default = data["def"].as_str().unwrap_or("");
            row = str::Color::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
        }
        "tel" => {
            let default = data["def"].as_str().unwrap_or("");
            row = str::Tel::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
        }
        "email" => {
            let default = data["def"].as_str().unwrap_or("");
            row = str::Email::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
        }
        "table" => {
            let table = data["table"].as_str().unwrap();
            let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
            let api = data["api"].as_str().unwrap();
            row = text::Table::new(require.clone(), field.clone(), title.clone(),
                                   table.clone(), fields.clone(), api.clone()).sql(model);
        }
        "text" => {
            let default = data["def"].as_str().unwrap_or("");
            row = text::Text::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
        }
        "url" => {
            let default = data["def"].as_str().unwrap_or("");
            row = text::Url::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
        }
        "file" => {
            let length = data["length"].as_i32().unwrap_or(1);
            let encrypt = data["encrypt"].as_bool().unwrap_or(false);
            let size = data["size"].as_usize().unwrap_or(0);
            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();

            row = text::File::new(require.clone(), field.clone(), title.clone(), length.clone(), encrypt, size, option).sql(model);
        }
        "json" => {
            let default = data["def"].clone();
            row = text::Json::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
        }
        "float" => {
            let length = data["length"].as_i32().unwrap();
            let dec = data["dec"].as_usize().unwrap();
            let default = data["def"].as_f32().unwrap();
            row = float::Float::new(require.clone(), field.clone(), title.clone(),
                                    length.clone(), dec.clone(),
                                    default.clone()).sql(model);
        }
        "int" => {
            let length = data["length"].as_i32().unwrap();
            let default = data["def"].as_i64().unwrap();
            row = int::Int::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql(model);
        }
        "switch" => {
            let default = data["def"].as_bool().unwrap_or(false);
            row = int::Switch::new(require.clone(), field.clone(), title.clone(),
                                   default.clone()).sql(model);
        }
        "datetime" => {
            let default = data["def"].as_str().unwrap();
            row = datetime::Datetime::new(require.clone(), field.clone(), title.clone(),
                                          default.clone()).sql(model);
        }
        "year" => {
            let default = data["def"].as_u64().unwrap();
            row = datetime::Year::new(require.clone(), field.clone(), title.clone(),
                                      default.clone()).sql(model);
        }
        "date" => {
            let default = data["def"].as_str().unwrap();
            row = datetime::Date::new(require.clone(), field.clone(), title.clone(),
                                      default.clone()).sql(model);
        }
        "time" => {
            let default = data["def"].as_str().unwrap();
            row = datetime::Time::new(require.clone(), field.clone(), title.clone(),
                                      default.clone()).sql(model);
        }
        "timestamp" => {
            let dec = data["dec"].as_i32().unwrap();
            let default = data["def"].as_f64().unwrap_or(0.0);
            row = datetime::Timestamp::new(require.clone(), field.clone(), title.clone(),
                                           dec.clone(), default.clone()).sql(model);
        }
        "select" => {
            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
            let def: Vec<&str> = data["def"].members().map(|x| x.as_str().unwrap()).collect();
            row = select::Select::new(require.clone(), field.clone(), title.clone(),
                                      option.clone(), def.clone()).sql(model);
        }
        "radio" => {
            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
            row = select::Radio::new(require.clone(), field.clone(), title.clone(),
                                     option.clone(), data["def"].as_str().unwrap()).sql(model);
        }
        _ => {
            println!("未知mode: {}", mode);
        }
    }
    format!("{}", row.clone())
}

/// 验证
pub fn verify(field: &str, data: JsonValue) -> JsonValue {
    let mode = data["mode"].as_str().unwrap();
    let require = data["require"].as_bool().unwrap_or(false);
    let title = data["title"].as_str().unwrap_or("未知标题");
    match mode {
        "autokey" => {
            int::AutoKey::new(true, field.clone(), title.clone()).verify(data.clone())
        }
        "key" => {
            let length = data["length"].as_i32().unwrap();
            str::Key::new(true, field.clone(), title.clone(), length.clone()).verify(data.clone())
        }
        "pass" => {
            let default = data["def"].as_str().unwrap();
            let length = data["length"].as_i32().unwrap();
            str::Pass::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).verify(data.clone())
        }
        "string" => {
            let default = data["def"].as_str().unwrap_or("");
            let length = data["length"].as_i32().unwrap_or(20);
            str::Str::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).verify(data.clone())
        }
        "color" => {
            let default = data["def"].as_str().unwrap_or("");
            str::Color::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
        }
        "tel" => {
            let default = data["def"].as_str().unwrap_or("");
            str::Tel::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
        }
        "email" => {
            let default = data["def"].as_str().unwrap_or("");
            str::Email::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
        }
        "table" => {
            let table = data["table"].as_str().unwrap();
            let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
            let api = data["api"].as_str().unwrap();
            text::Table::new(require.clone(), field.clone(), title.clone(),
                             table.clone(), fields.clone(), api.clone()).verify(data.clone())
        }
        "text" => {
            let default = data["def"].as_str().unwrap_or("");
            text::Text::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
        }
        "url" => {
            let default = data["def"].as_str().unwrap_or("");
            text::Url::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
        }
        "file" => {
            let length = data["length"].as_i32().unwrap_or(1);
            let encrypt = data["encrypt"].as_bool().unwrap_or(false);
            let size = data["size"].as_usize().unwrap_or(0);
            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
            text::File::new(require.clone(), field.clone(), title.clone(), length.clone(), encrypt, size, option).verify(data.clone())
        }
        "json" => {
            let default = data["def"].clone();
            text::Json::new(require.clone(), field.clone(), title.clone(),
                            default).verify(data.clone())
        }
        "float" => {
            let length = data["length"].as_i32().unwrap();
            let dec = data["dec"].as_usize().unwrap();
            let default = data["def"].as_f32().unwrap();
            float::Float::new(require.clone(), field.clone(), title.clone(),
                              length.clone(), dec.clone(),
                              default.clone()).verify(data.clone())
        }
        "int" => {
            let length = data["length"].as_i32().unwrap();
            let default = data["def"].as_i64().unwrap();
            int::Int::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).verify(data.clone())
        }
        "switch" => {
            let default = data["def"].as_bool().unwrap_or(false);
            int::Switch::new(require.clone(), field.clone(), title.clone(),
                             default.clone()).verify(data.clone())
        }
        "datetime" => {
            let default = data["def"].as_str().unwrap();
            datetime::Datetime::new(require.clone(), field.clone(), title.clone(),
                                    default.clone()).verify(data.clone())
        }
        "year" => {
            let default = data["def"].as_u64().unwrap();
            datetime::Year::new(require.clone(), field.clone(), title.clone(),
                                default.clone()).verify(data.clone())
        }
        "date" => {
            let default = data["def"].as_str().unwrap();
            datetime::Date::new(require.clone(), field.clone(), title.clone(),
                                default.clone()).verify(data.clone())
        }
        "time" => {
            let default = data["def"].as_str().unwrap();
            datetime::Time::new(require.clone(), field.clone(), title.clone(),
                                default.clone()).verify(data.clone())
        }
        "timestamp" => {
            let dec = data["dec"].as_i32().unwrap();
            let default = data["def"].as_f64().unwrap_or(0.0);
            datetime::Timestamp::new(require.clone(), field.clone(), title.clone(),
                                     dec.clone(), default.clone()).verify(data.clone())
        }
        "select" => {
            let option: Vec<&str> = data["option"].members().map(|c| c.as_str().unwrap()).collect();
            let def: Vec<&str> = data["def"].members().map(|c| c.as_str().unwrap()).collect();
            select::Select::new(require.clone(), field.clone(), title.clone(),
                                option.clone(), def.clone()).verify(data.clone())
        }
        "radio" => {
            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
            select::Radio::new(require.clone(), field.clone(), title.clone(),
                               option.clone(), data["def"].as_str().unwrap()).verify(data.clone())
        }
        _ => {
            println!("未知mode: {}", mode);
            object! {}
        }
    }
}