1use json::JsonValue;
2use log::info;
3
4pub mod datetime;
6pub mod dict;
8pub mod files;
10pub mod float;
11pub mod int;
12pub mod location;
14pub mod select;
15pub mod str;
16pub mod table;
18pub mod text;
19
20pub trait Field {
21 fn sql(&mut self, model: &str) -> String;
22 fn hide(&mut self) -> &mut Self;
24 fn describe(&mut self, text: &str) -> &mut Self;
26 fn field(&mut self) -> JsonValue;
27 fn verify(&mut self, data: JsonValue) -> JsonValue {
29 data
30 }
31 fn swagger(&mut self) -> JsonValue;
33 fn example(&mut self, data: JsonValue) -> &mut Self;
35}
36
37#[derive(Debug)]
38pub enum FieldMode {
39 Key,
40 Pass,
41 Color,
42 String,
43 Tel,
44 Ident,
45 Code,
46 Email,
47 Table,
48 Text,
49 Editor,
50 Url,
51 Files,
52 Json,
53 Array,
54 Object,
55 Float,
56 Int,
57 Switch,
58 Datetime,
59 Year,
60 Date,
61 Time,
62 Timestamp,
63 Select,
64 Radio,
65 Location,
66 Dict,
67 BarCode,
68 QrCode,
69 Tree,
70}
71
72impl FieldMode {
73 pub fn from(name: &str) -> FieldMode {
74 match name {
75 "key" => FieldMode::Key,
76 "pass" => FieldMode::Pass,
77 "string" => FieldMode::String,
78 "color" => FieldMode::Color,
79 "tel" => FieldMode::Tel,
80 "ident" => FieldMode::Ident,
81 "email" => FieldMode::Email,
82 "table" => FieldMode::Table,
83 "text" => FieldMode::Text,
84 "editor" => FieldMode::Editor,
85 "url" => FieldMode::Url,
86 "file" => FieldMode::Files,
87 "json" => FieldMode::Json,
88 "array" => FieldMode::Array,
89 "object" => FieldMode::Object,
90 "float" => FieldMode::Float,
91 "int" => FieldMode::Int,
92 "switch" => FieldMode::Switch,
93 "datetime" => FieldMode::Datetime,
94 "year" => FieldMode::Year,
95 "date" => FieldMode::Date,
96 "time" => FieldMode::Time,
97 "timestamp" => FieldMode::Timestamp,
98 "select" => FieldMode::Select,
99 "radio" => FieldMode::Radio,
100 "location" => FieldMode::Location,
101 "dict" => FieldMode::Dict,
102 "code" => FieldMode::Code,
103 "barcode" => FieldMode::BarCode,
104 "qrcode" => FieldMode::QrCode,
105 "tree" => FieldMode::Tree,
106 _ => {
107 info!("未知字段类型 mode: {}", name);
108 FieldMode::String
109 }
110 }
111 }
112}
113
114pub fn field(model: &str, field: &str, data: JsonValue) -> String {
116 let mode = data["mode"].as_str().unwrap();
117 let require = data["require"].as_bool().unwrap_or(false);
118 let title = data["title"].as_str().unwrap_or("未知标题");
119
120 let field_mode = FieldMode::from(mode);
121
122 let row = match field_mode {
123 FieldMode::Table => {
124 let table = data["table"].as_str().unwrap();
125 let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
126 let api = data["api"].as_str().unwrap();
127 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
128 table::Table::new(require, field, title, table, fields, api).multiple(multiple_count).sql(model)
129 }
130 FieldMode::Tree => {
131 let table = data["table"].as_str().unwrap();
132 let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
133 let api = data["api"].as_str().unwrap();
134 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
135 table::Tree::new(require, field, title, table, fields, api).multiple(multiple_count).sql(model)
136 }
137 FieldMode::Text => {
138 let default = data["def"].as_str().unwrap_or("");
139 let length = data["length"].as_i32().unwrap_or(0);
140 text::Text::new(require, field, title, default).length(length).sql(model)
141 }
142 FieldMode::Editor => {
143 let default = data["def"].as_str().unwrap_or("");
144 let length = data["length"].as_i32().unwrap_or(0);
145 text::Editor::new(require, field, title, default).length(length).sql(model)
146 }
147 FieldMode::Json => {
148 let default = data["def"].clone();
149 let length = data["length"].as_i32().unwrap_or(0);
150 text::Json::new(require, field, title, default).length(length).sql(model)
151 }
152 FieldMode::Array => {
153 let default = data["def"].clone();
154 let length = data["length"].as_i32().unwrap_or(0);
155 text::Array::new(require, field, title, default).length(length).sql(model)
156 }
157 FieldMode::Object => {
158 let default = data["def"].clone();
159 let length = data["length"].as_i32().unwrap_or(0);
160 text::Object::new(require, field, title, default).length(length).sql(model)
161 }
162 FieldMode::Url => {
163 let default = data["def"].as_str().unwrap_or("");
164 text::Url::new(require, field, title, default).sql(model)
165 }
166 FieldMode::Files => {
167 let length = data["length"].as_i32().unwrap_or(1);
168 let encrypt = data["encrypt"].as_bool().unwrap_or(false);
169 let size = data["size"].as_usize().unwrap_or(0);
170 let default = data["def"].as_str().unwrap_or("");
171 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
172 let mut files_mode = files::Files::new(require, field, title);
173
174 if length > 1 {
175 files_mode.multiple(length);
176 }
177 if encrypt {
178 files_mode.encrypt();
179 }
180 files_mode.def(default);
181 files_mode.size(size);
182 files_mode.option(option);
183 files_mode.sql(model)
184 }
185 FieldMode::Float => {
186 let length = data["length"].as_i32().unwrap();
187 let dec = data["dec"].as_usize().unwrap();
188 let default = data["def"].to_string().parse::<f64>().unwrap_or(0.0);
189 float::Float::new(require, field, title, length, dec, default).sql(model)
190 }
191 FieldMode::Int => {
192 let length = data["length"].as_i32().unwrap();
193 let default = data["def"].as_i64().unwrap();
194 int::Int::new(require, field, title, length, default).sql(model)
195 }
196 FieldMode::Switch => {
197 let default = data["def"].to_string().parse::<bool>().unwrap();
198 int::Switch::new(require, field, title, default).sql(model)
199 }
200 FieldMode::Datetime => {
201 let default = data["def"].as_str().unwrap_or("");
202 datetime::Datetime::new(require, field, title, default).sql(model)
203 }
204 FieldMode::Year => {
205 let default = data["def"].as_str().unwrap_or("");
206 datetime::Year::new(require, field, title, default).sql(model)
207 }
208 FieldMode::Date => {
209 let default = data["def"].as_str().unwrap();
210 datetime::Date::new(require, field, title, default).sql(model)
211 }
212 FieldMode::Time => {
213 let default = data["def"].as_str().unwrap();
214 datetime::Time::new(require, field, title, default).sql(model)
215 }
216 FieldMode::Timestamp => {
217 let dec = data["dec"].as_i32().unwrap();
218 let default = data["def"].as_f64().unwrap_or(0.0);
219 datetime::Timestamp::new(require, field, title, dec, default).sql(model)
220 }
221 FieldMode::Select => {
222 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
223
224 let def: Vec<&str> = data["def"].members().map(|x| x.as_str().unwrap()).collect();
225
226 select::Select::new(require, field, title, option, def).table_name(data["table_name"].as_str().unwrap_or("")).sql(model)
227 }
228 FieldMode::Radio => {
229 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
230 select::Radio::new(require, field, title, option, data["def"].as_str().unwrap()).table_name(data["table_name"].as_str().unwrap_or("")).sql(model)
231 }
232 FieldMode::Location => {
233 let default = data["def"].as_str().unwrap_or("");
234 location::Location::new(require, field, title).def(default).sql(model)
235 }
236 FieldMode::Dict => {
237 let table = data["table"].as_str().unwrap();
238 let fields = data["fields"].as_str().unwrap_or("");
239 let api = data["api"].as_str().unwrap();
240 let default = data["def"].as_str().unwrap_or("");
241
242 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
243 dict::Dict::new(require, field, title, table, fields, api).multiple(multiple_count).default(default).sql(model)
244 }
245
246 FieldMode::Key | FieldMode::Pass | FieldMode::String | FieldMode::Code | FieldMode::BarCode | FieldMode::Email | FieldMode::Tel | FieldMode::Ident | FieldMode::Color | FieldMode::QrCode => {
247 let default = data["def"].as_str().unwrap_or("");
248 let dec = data["dec"].as_str().unwrap_or("");
249 let length = data["length"].as_usize().unwrap_or(20);
250 match FieldMode::from(mode) {
251 FieldMode::Code => {
252 str::Code::new(require, field, title, length, dec, default).sql(model)
253 }
254 FieldMode::BarCode => str::BarCode::new(require, field, title, default).sql(model),
255 FieldMode::Email => str::Email::new(require, field, title, default).sql(model),
256 FieldMode::Tel => str::Tel::new(require, field, title, default).sql(model),
257 FieldMode::Ident => str::Ident::new(require, field, title, default).sql(model),
258 FieldMode::Color => str::Color::new(require, field, title, default).sql(model),
259 FieldMode::String => {
260 str::Str::new(require, field, title, length, default).sql(model)
261 }
262 FieldMode::Pass => {
263 str::Pass::new(require, field, title, length, default).sql(model)
264 }
265 FieldMode::Key => str::Key::new(true, field, title, length).auto(data["auto"].as_bool().unwrap()).sql(model),
266 FieldMode::QrCode => {
267 str::QrCode::new(require, field, title, length, default).sql(model)
268 }
269 _ => str::Str::new(require, field, title, length, default).sql(model),
270 }
271 }
272 };
273 row.to_string()
274}
275
276pub fn verify(field: &str, data: JsonValue) -> JsonValue {
278 let mode = data["mode"].as_str().unwrap();
279 let require = data["require"].as_bool().unwrap_or(false);
280 let title = data["title"].as_str().unwrap_or("未知标题");
281 let field_mode = FieldMode::from(mode);
282
283 match field_mode {
284 FieldMode::BarCode | FieldMode::Pass | FieldMode::Key | FieldMode::String | FieldMode::Color | FieldMode::Tel | FieldMode::Ident | FieldMode::Email | FieldMode::Code | FieldMode::QrCode => {
285 let default = data["def"].as_str().unwrap_or("");
286 let length = data["length"].as_usize().unwrap_or(20);
287 match field_mode {
288 FieldMode::Key => str::Key::new(true, field, title, length).auto(data["auto"].as_bool().unwrap()).verify(data),
289 FieldMode::Pass => {
290 str::Pass::new(require, field, title, length, default).verify(data)
291 }
292 FieldMode::String => {
293 str::Str::new(require, field, title, length, default).verify(data)
294 }
295 FieldMode::Color => str::Color::new(require, field, title, default).verify(data),
296 FieldMode::Tel => str::Tel::new(require, field, title, default).verify(data),
297 FieldMode::Ident => str::Ident::new(require, field, title, default).verify(data),
298 FieldMode::Email => str::Email::new(require, field, title, default).verify(data),
299 FieldMode::BarCode => {
300 str::BarCode::new(require, field, title, default).verify(data)
301 }
302 FieldMode::Code => {
303 let dec = data["dec"].as_str().unwrap_or("");
304 str::Code::new(require, field, title, length, dec, default).verify(data)
305 }
306 FieldMode::QrCode => {
307 str::QrCode::new(require, field, title, length, default).verify(data)
308 }
309 _ => str::Str::new(require, field, title, length, default).verify(data),
310 }
311 }
312 FieldMode::Table => {
313 let table = data["table"].as_str().unwrap();
314 let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
315 let api = data["api"].as_str().unwrap();
316 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
317 table::Table::new(require, field, title, table, fields, api).multiple(multiple_count).verify(data)
318 }
319 FieldMode::Tree => {
320 let table = data["table"].as_str().unwrap();
321 let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
322 let api = data["api"].as_str().unwrap();
323 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
324 table::Tree::new(require, field, title, table, fields, api).multiple(multiple_count).verify(data)
325 }
326 FieldMode::Text => {
327 let default = data["def"].as_str().unwrap_or("");
328 let length = data["length"].as_i32().unwrap_or(0);
329 text::Text::new(require, field, title, default).length(length).verify(data)
330 }
331 FieldMode::Editor => {
332 let default = data["def"].as_str().unwrap_or("");
333 let length = data["length"].as_i32().unwrap_or(0);
334 text::Editor::new(require, field, title, default).length(length).verify(data)
335 }
336 FieldMode::Json => {
337 let default = data["def"].clone();
338 let length = data["length"].as_i32().unwrap_or(0);
339 text::Json::new(require, field, title, default).length(length).verify(data)
340 }
341 FieldMode::Array => {
342 let default = data["def"].clone();
343 let length = data["length"].as_i32().unwrap_or(0);
344 text::Array::new(require, field, title, default).length(length).verify(data)
345 }
346 FieldMode::Object => {
347 let default = data["def"].clone();
348 let length = data["length"].as_i32().unwrap_or(0);
349 text::Object::new(require, field, title, default).length(length).verify(data)
350 }
351 FieldMode::Url => {
352 let default = data["def"].as_str().unwrap_or("");
353 text::Url::new(require, field, title, default).verify(data)
354 }
355 FieldMode::Files => {
356 let length = data["length"].as_i32().unwrap_or(1);
357 let encrypt = data["encrypt"].as_bool().unwrap_or(false);
358 let size = data["size"].as_usize().unwrap_or(0);
359 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
360 let default = data["def"].as_str().unwrap_or("");
361
362 let mut files_mode = files::Files::new(require, field, title);
363
364 if length > 1 {
365 files_mode.multiple(length);
366 }
367 if encrypt {
368 files_mode.encrypt();
369 }
370 files_mode.def(default);
371 files_mode.size(size);
372 files_mode.option(option);
373 files_mode.verify(data)
374 }
375 FieldMode::Float => {
376 let length = data["length"].as_i32().unwrap();
377 let dec = data["dec"].as_usize().unwrap();
378 let default = data["def"].as_f64().unwrap();
379 float::Float::new(require, field, title, length, dec, default).verify(data)
380 }
381 FieldMode::Int => {
382 let length = data["length"].as_i32().unwrap();
383 let default = data["def"].as_i64().unwrap();
384 int::Int::new(require, field, title, length, default).verify(data)
385 }
386 FieldMode::Switch => {
387 let default = data["def"].to_string().parse::<u8>().unwrap();
388 let default = default == 1;
389 int::Switch::new(require, field, title, default).verify(data)
390 }
391 FieldMode::Year | FieldMode::Date | FieldMode::Datetime | FieldMode::Time | FieldMode::Timestamp => {
392 let default = data["def"].as_str().unwrap_or("");
393 match field_mode {
394 FieldMode::Datetime => {
395 datetime::Datetime::new(require, field, title, default).verify(data)
396 }
397 FieldMode::Year => datetime::Year::new(require, field, title, default).verify(data),
398 FieldMode::Date => datetime::Date::new(require, field, title, default).verify(data),
399 FieldMode::Time => datetime::Time::new(require, field, title, default).verify(data),
400 FieldMode::Timestamp => {
401 let dec = data["dec"].as_i32().unwrap();
402 let default = data["def"].as_f64().unwrap_or(0.0);
403 datetime::Timestamp::new(require, field, title, dec, default).verify(data)
404 }
405 _ => datetime::Datetime::new(require, field, title, default).verify(data),
406 }
407 }
408
409 FieldMode::Select => {
410 let option: Vec<&str> = data["option"].members().map(|c| c.as_str().unwrap()).collect();
411 let def: Vec<&str> = data["def"].members().map(|c| c.as_str().unwrap()).collect();
412 select::Select::new(require, field, title, option, def).verify(data)
413 }
414 FieldMode::Radio => {
415 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
416 select::Radio::new(require, field, title, option, data["def"].as_str().unwrap()).verify(data)
417 }
418
419 FieldMode::Location => {
420 let default = data["def"].as_str().unwrap_or("");
421 location::Location::new(require, field, title).def(default).verify(data)
422 }
423 FieldMode::Dict => {
424 let table = data["table"].as_str().unwrap();
425 let fields = data["fields"].as_str().unwrap_or("");
426 let api = data["api"].as_str().unwrap();
427 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
428 dict::Dict::new(require, field, title, table, fields, api).multiple(multiple_count).verify(data)
429 }
430 }
431}