df_fields/
lib.rs

1use json::{JsonValue, object};
2
3pub mod str;
4pub mod int;
5pub mod text;
6pub mod float;
7pub mod select;
8pub mod datetime;
9
10pub trait Field {
11    fn sql(&mut self, model: &str) -> String;
12    fn field(&mut self) -> JsonValue;
13    /// 验证方法
14    fn verify(&mut self, data: JsonValue) -> JsonValue {
15        data
16    }
17}
18
19/// 解析数据
20pub fn field(model: &str, field: &str, data: JsonValue) -> String {
21    let mut row = format!("");
22    let mode = data["mode"].as_str().unwrap();
23    let require = data["require"].as_bool().unwrap_or(false);
24    let title = data["title"].as_str().unwrap_or("未知标题");
25    match mode {
26        "autokey" => {
27            row = int::AutoKey::new(true, field.clone(), title.clone()).sql(model);
28        }
29        "key" => {
30            let length = data["length"].as_i32().unwrap();
31            row = str::Key::new(true, field.clone(), title.clone(), length.clone()).sql(model);
32        }
33        "pass" => {
34            let default = data["def"].as_str().unwrap();
35            let length = data["length"].as_i32().unwrap();
36            row = str::Pass::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql(model);
37        }
38        "string" => {
39            let default = data["def"].as_str().unwrap_or("");
40            let length = data["length"].as_i32().unwrap_or(20);
41            row = str::Str::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql(model);
42        }
43        "color" => {
44            let default = data["def"].as_str().unwrap_or("");
45            row = str::Color::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
46        }
47        "tel" => {
48            let default = data["def"].as_str().unwrap_or("");
49            row = str::Tel::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
50        }
51        "email" => {
52            let default = data["def"].as_str().unwrap_or("");
53            row = str::Email::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
54        }
55        "table" => {
56            let table = data["table"].as_str().unwrap();
57            let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
58            let api = data["api"].as_str().unwrap();
59            row = text::Table::new(require.clone(), field.clone(), title.clone(),
60                                   table.clone(), fields.clone(), api.clone()).sql(model);
61        }
62        "text" => {
63            let default = data["def"].as_str().unwrap_or("");
64            row = text::Text::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
65        }
66        "url" => {
67            let default = data["def"].as_str().unwrap_or("");
68            row = text::Url::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
69        }
70        "file" => {
71            let length = data["length"].as_i32().unwrap_or(1);
72            let encrypt = data["encrypt"].as_bool().unwrap_or(false);
73            let size = data["size"].as_usize().unwrap_or(0);
74            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
75
76            row = text::File::new(require.clone(), field.clone(), title.clone(), length.clone(), encrypt, size, option).sql(model);
77        }
78        "json" => {
79            let default = data["def"].clone();
80            row = text::Json::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
81        }
82        "float" => {
83            let length = data["length"].as_i32().unwrap();
84            let dec = data["dec"].as_usize().unwrap();
85            let default = data["def"].as_f32().unwrap();
86            row = float::Float::new(require.clone(), field.clone(), title.clone(),
87                                    length.clone(), dec.clone(),
88                                    default.clone()).sql(model);
89        }
90        "int" => {
91            let length = data["length"].as_i32().unwrap();
92            let default = data["def"].as_i64().unwrap();
93            row = int::Int::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql(model);
94        }
95        "switch" => {
96            let default = data["def"].as_bool().unwrap_or(false);
97            row = int::Switch::new(require.clone(), field.clone(), title.clone(),
98                                   default.clone()).sql(model);
99        }
100        "datetime" => {
101            let default = data["def"].as_str().unwrap();
102            row = datetime::Datetime::new(require.clone(), field.clone(), title.clone(),
103                                          default.clone()).sql(model);
104        }
105        "year" => {
106            let default = data["def"].as_u64().unwrap();
107            row = datetime::Year::new(require.clone(), field.clone(), title.clone(),
108                                      default.clone()).sql(model);
109        }
110        "date" => {
111            let default = data["def"].as_str().unwrap();
112            row = datetime::Date::new(require.clone(), field.clone(), title.clone(),
113                                      default.clone()).sql(model);
114        }
115        "time" => {
116            let default = data["def"].as_str().unwrap();
117            row = datetime::Time::new(require.clone(), field.clone(), title.clone(),
118                                      default.clone()).sql(model);
119        }
120        "timestamp" => {
121            let dec = data["dec"].as_i32().unwrap();
122            let default = data["def"].as_f64().unwrap_or(0.0);
123            row = datetime::Timestamp::new(require.clone(), field.clone(), title.clone(),
124                                           dec.clone(), default.clone()).sql(model);
125        }
126        "select" => {
127            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
128            let def: Vec<&str> = data["def"].members().map(|x| x.as_str().unwrap()).collect();
129            row = select::Select::new(require.clone(), field.clone(), title.clone(),
130                                      option.clone(), def.clone()).sql(model);
131        }
132        "radio" => {
133            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
134            row = select::Radio::new(require.clone(), field.clone(), title.clone(),
135                                     option.clone(), data["def"].as_str().unwrap()).sql(model);
136        }
137        _ => {
138            println!("未知mode: {}", mode);
139        }
140    }
141    format!("{}", row.clone())
142}
143
144/// 验证
145pub fn verify(field: &str, data: JsonValue) -> JsonValue {
146    let mode = data["mode"].as_str().unwrap();
147    let require = data["require"].as_bool().unwrap_or(false);
148    let title = data["title"].as_str().unwrap_or("未知标题");
149    match mode {
150        "autokey" => {
151            int::AutoKey::new(true, field.clone(), title.clone()).verify(data.clone())
152        }
153        "key" => {
154            let length = data["length"].as_i32().unwrap();
155            str::Key::new(true, field.clone(), title.clone(), length.clone()).verify(data.clone())
156        }
157        "pass" => {
158            let default = data["def"].as_str().unwrap();
159            let length = data["length"].as_i32().unwrap();
160            str::Pass::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).verify(data.clone())
161        }
162        "string" => {
163            let default = data["def"].as_str().unwrap_or("");
164            let length = data["length"].as_i32().unwrap_or(20);
165            str::Str::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).verify(data.clone())
166        }
167        "color" => {
168            let default = data["def"].as_str().unwrap_or("");
169            str::Color::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
170        }
171        "tel" => {
172            let default = data["def"].as_str().unwrap_or("");
173            str::Tel::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
174        }
175        "email" => {
176            let default = data["def"].as_str().unwrap_or("");
177            str::Email::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
178        }
179        "table" => {
180            let table = data["table"].as_str().unwrap();
181            let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
182            let api = data["api"].as_str().unwrap();
183            text::Table::new(require.clone(), field.clone(), title.clone(),
184                             table.clone(), fields.clone(), api.clone()).verify(data.clone())
185        }
186        "text" => {
187            let default = data["def"].as_str().unwrap_or("");
188            text::Text::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
189        }
190        "url" => {
191            let default = data["def"].as_str().unwrap_or("");
192            text::Url::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
193        }
194        "file" => {
195            let length = data["length"].as_i32().unwrap_or(1);
196            let encrypt = data["encrypt"].as_bool().unwrap_or(false);
197            let size = data["size"].as_usize().unwrap_or(0);
198            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
199            text::File::new(require.clone(), field.clone(), title.clone(), length.clone(), encrypt, size, option).verify(data.clone())
200        }
201        "json" => {
202            let default = data["def"].clone();
203            text::Json::new(require.clone(), field.clone(), title.clone(),
204                            default).verify(data.clone())
205        }
206        "float" => {
207            let length = data["length"].as_i32().unwrap();
208            let dec = data["dec"].as_usize().unwrap();
209            let default = data["def"].as_f32().unwrap();
210            float::Float::new(require.clone(), field.clone(), title.clone(),
211                              length.clone(), dec.clone(),
212                              default.clone()).verify(data.clone())
213        }
214        "int" => {
215            let length = data["length"].as_i32().unwrap();
216            let default = data["def"].as_i64().unwrap();
217            int::Int::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).verify(data.clone())
218        }
219        "switch" => {
220            let default = data["def"].as_bool().unwrap_or(false);
221            int::Switch::new(require.clone(), field.clone(), title.clone(),
222                             default.clone()).verify(data.clone())
223        }
224        "datetime" => {
225            let default = data["def"].as_str().unwrap();
226            datetime::Datetime::new(require.clone(), field.clone(), title.clone(),
227                                    default.clone()).verify(data.clone())
228        }
229        "year" => {
230            let default = data["def"].as_u64().unwrap();
231            datetime::Year::new(require.clone(), field.clone(), title.clone(),
232                                default.clone()).verify(data.clone())
233        }
234        "date" => {
235            let default = data["def"].as_str().unwrap();
236            datetime::Date::new(require.clone(), field.clone(), title.clone(),
237                                default.clone()).verify(data.clone())
238        }
239        "time" => {
240            let default = data["def"].as_str().unwrap();
241            datetime::Time::new(require.clone(), field.clone(), title.clone(),
242                                default.clone()).verify(data.clone())
243        }
244        "timestamp" => {
245            let dec = data["dec"].as_i32().unwrap();
246            let default = data["def"].as_f64().unwrap_or(0.0);
247            datetime::Timestamp::new(require.clone(), field.clone(), title.clone(),
248                                     dec.clone(), default.clone()).verify(data.clone())
249        }
250        "select" => {
251            let option: Vec<&str> = data["option"].members().map(|c| c.as_str().unwrap()).collect();
252            let def: Vec<&str> = data["def"].members().map(|c| c.as_str().unwrap()).collect();
253            select::Select::new(require.clone(), field.clone(), title.clone(),
254                                option.clone(), def.clone()).verify(data.clone())
255        }
256        "radio" => {
257            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
258            select::Radio::new(require.clone(), field.clone(), title.clone(),
259                               option.clone(), data["def"].as_str().unwrap()).verify(data.clone())
260        }
261        _ => {
262            println!("未知mode: {}", mode);
263            object! {}
264        }
265    }
266}