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! {}
}
}
}