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 require(&mut self, _require: bool) -> &mut Self {
22 self
23 }
24 fn sql(&mut self, model: &str) -> String;
25 fn hide(&mut self) -> &mut Self;
27 fn describe(&mut self, text: &str) -> &mut Self;
29 fn field(&mut self) -> JsonValue;
30 fn verify(&mut self, data: JsonValue) -> JsonValue {
32 data
33 }
34 fn swagger(&mut self) -> JsonValue;
36 fn example(&mut self, data: JsonValue) -> &mut Self;
38}
39
40#[derive(Debug, Clone)]
41pub enum FieldMode {
42 Key,
43 Pass,
44 Color,
45 String,
46 Tel,
47 Ident,
48 Code,
49 Email,
50 Table,
51 Text,
52 Editor,
53 Url,
54 Files,
55 Json,
56 Array,
57 Object,
58 Float,
59 Int,
60 Switch,
61 Datetime,
62 Year,
63 YearMonth,
64 Date,
65 Time,
66 Timestamp,
67 Select,
68 Radio,
69 Location,
70 Dict,
71 BarCode,
72 QrCode,
73 Tree,
74 Polygon,
75 TableMultiple,
76 Address,
77}
78
79impl FieldMode {
80 pub fn from(name: &str) -> FieldMode {
81 match name {
82 "key" => FieldMode::Key,
83 "pass" => FieldMode::Pass,
84 "string" => FieldMode::String,
85 "color" => FieldMode::Color,
86 "tel" => FieldMode::Tel,
87 "ident" => FieldMode::Ident,
88 "email" => FieldMode::Email,
89 "table" => FieldMode::Table,
90 "text" => FieldMode::Text,
91 "editor" => FieldMode::Editor,
92 "url" => FieldMode::Url,
93 "file" => FieldMode::Files,
94 "json" => FieldMode::Json,
95 "array" => FieldMode::Array,
96 "object" => FieldMode::Object,
97 "float" => FieldMode::Float,
98 "int" => FieldMode::Int,
99 "switch" => FieldMode::Switch,
100 "datetime" => FieldMode::Datetime,
101 "year" => FieldMode::Year,
102 "yearmonth" => FieldMode::YearMonth,
103 "date" => FieldMode::Date,
104 "time" => FieldMode::Time,
105 "timestamp" => FieldMode::Timestamp,
106 "select" => FieldMode::Select,
107 "radio" => FieldMode::Radio,
108 "location" => FieldMode::Location,
109 "polygon" => FieldMode::Polygon,
110 "dict" => FieldMode::Dict,
111 "code" => FieldMode::Code,
112 "barcode" => FieldMode::BarCode,
113 "qrcode" => FieldMode::QrCode,
114 "tree" => FieldMode::Tree,
115 "table_multiple" => FieldMode::TableMultiple,
116 "address" => FieldMode::Address,
117 _ => {
118 info!("未知字段类型 mode: {name}");
119 FieldMode::String
120 }
121 }
122 }
123}
124
125pub fn field(model: &str, field: &str, data: JsonValue) -> String {
127 let mode = data["mode"].as_str().unwrap();
128 let require = data["require"].as_bool().unwrap_or(false);
129 let title = data["title"].as_str().unwrap_or("未知标题");
130
131 let field_mode = FieldMode::from(mode);
132
133 let row = match field_mode {
134 FieldMode::Table => {
135 let table = data["table"].as_str().unwrap();
136 let fields: Vec<&str> = data["fields"]
137 .members()
138 .map(|x| x.as_str().unwrap())
139 .collect();
140 let api = data["api"].as_str().unwrap();
141 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
142 table::Table::new(require, field, title, table, fields, api)
143 .multiple(multiple_count)
144 .sql(model)
145 }
146 FieldMode::Tree => {
147 let table = data["table"].as_str().unwrap();
148 let pid_field = data["pid_field"].as_str().unwrap();
149 let fields: Vec<&str> = data["fields"]
150 .members()
151 .map(|x| x.as_str().unwrap())
152 .collect();
153 let api = data["api"].as_str().unwrap();
154 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
155 table::Tree::new(require, field, title, table, pid_field, fields, api)
156 .multiple(multiple_count)
157 .sql(model)
158 }
159 FieldMode::Text => {
160 let default = data["def"].as_str().unwrap_or("");
161 let length = data["length"].as_i32().unwrap_or(0);
162 text::Text::new(require, field, title, default)
163 .length(length)
164 .sql(model)
165 }
166 FieldMode::Editor => {
167 let default = data["def"].as_str().unwrap_or("");
168 let length = data["length"].as_i32().unwrap_or(0);
169 text::Editor::new(require, field, title, default)
170 .length(length)
171 .sql(model)
172 }
173 FieldMode::Json => {
174 let default = data["def"].clone();
175 let length = data["length"].as_i32().unwrap_or(0);
176 text::Object::new(require, field, title, default)
177 .length(length)
178 .sql(model)
179 }
180 FieldMode::Array => {
181 let default = data["def"].clone();
182 let length = data["length"].as_i32().unwrap_or(0);
183 text::Array::new(require, field, title, default)
184 .length(length)
185 .sql(model)
186 }
187 FieldMode::TableMultiple => {
188 let table_name = data["table"].as_str().unwrap_or("");
189 let fields: Vec<&str> = data["fields"]
190 .members()
191 .map(|x| x.as_str().unwrap_or(""))
192 .collect();
193 let api = data["api"].as_str().unwrap_or("");
194 let multiple_count = data["multiple_count"].as_i32().unwrap_or(0);
195 table::TableMultiple::new(require, field, title, table_name, fields, api)
196 .multiple_count(multiple_count)
197 .sql(model)
198 }
199 FieldMode::Object => {
200 let default = data["def"].clone();
201 let length = data["length"].as_i32().unwrap_or(0);
202 text::Object::new(require, field, title, default)
203 .length(length)
204 .sql(model)
205 }
206 FieldMode::Url => {
207 let default = data["def"].as_str().unwrap_or("");
208 text::Url::new(require, field, title, default).sql(model)
209 }
210 FieldMode::Files => {
211 let length = data["length"].as_i32().unwrap_or(1);
212 let encrypt = data["encrypt"].as_bool().unwrap_or(false);
213 let size = data["size"].as_usize().unwrap_or(0);
214 let default = data["def"].as_str().unwrap_or("");
215 let option: Vec<&str> = data["option"]
216 .members()
217 .map(|x| x.as_str().unwrap())
218 .collect();
219 let mut files_mode = files::Files::new(require, field, title);
220
221 if length > 1 {
222 files_mode.multiple(length);
223 }
224 if encrypt {
225 files_mode.encrypt();
226 }
227 files_mode.def(default);
228 files_mode.size(size);
229 files_mode.option(option);
230 files_mode.sql(model)
231 }
232 FieldMode::Float => {
233 let length = data["length"].as_i32().unwrap();
234 let dec = data["dec"].as_usize().unwrap();
235 let default = data["def"].to_string().parse::<f64>().unwrap_or(0.0);
236 float::Float::new(require, field, title, length, dec, default).sql(model)
237 }
238 FieldMode::Int => {
239 let length = data["length"].as_i32().unwrap();
240 let default = data["def"].as_i64().unwrap();
241 int::Int::new(require, field, title, length, default).sql(model)
242 }
243 FieldMode::Switch => {
244 let default = data["def"].to_string().parse::<bool>().unwrap();
245 int::Switch::new(require, field, title, default).sql(model)
246 }
247 FieldMode::Datetime => {
248 let default = data["def"].as_i64().unwrap_or(0);
249 datetime::Datetime::new(require, field, title, default).sql(model)
250 }
251 FieldMode::Year => {
252 let default = data["def"].as_str().unwrap_or("");
253 datetime::Year::new(require, field, title, default).sql(model)
254 }
255 FieldMode::YearMonth => {
256 let default = data["def"].as_i64().unwrap_or(0);
257 datetime::YearMonth::new(require, field, title, default).sql(model)
258 }
259 FieldMode::Date => {
260 let default = data["def"].as_i64().unwrap_or(0);
261 datetime::Date::new(require, field, title, default).sql(model)
262 }
263 FieldMode::Time => {
264 let default = data["def"].as_str().unwrap();
265 datetime::Time::new(require, field, title, default).sql(model)
266 }
267 FieldMode::Timestamp => {
268 let dec = data["dec"].as_i32().unwrap();
269 let default = data["def"].as_f64().unwrap_or(0.0);
270 datetime::Timestamp::new(require, field, title, dec, default).sql(model)
271 }
272 FieldMode::Select => {
273 let option: Vec<&str> = data["option"]
274 .members()
275 .map(|x| x.as_str().unwrap())
276 .collect();
277
278 let def: Vec<&str> = data["def"].members().map(|x| x.as_str().unwrap()).collect();
279
280 select::Select::new(require, field, title, option, def)
281 .table_name(data["table_name"].as_str().unwrap_or(""))
282 .sql(model)
283 }
284 FieldMode::Radio => {
285 let option: Vec<&str> = data["option"]
286 .members()
287 .map(|x| x.as_str().unwrap())
288 .collect();
289 select::Radio::new(require, field, title, option, data["def"].as_str().unwrap())
290 .table_name(data["table_name"].as_str().unwrap_or(""))
291 .sql(model)
292 }
293 FieldMode::Location => {
294 let default = data["def"].as_str().unwrap_or("");
295 location::Location::new(require, field, title)
296 .def(default)
297 .sql(model)
298 }
299 FieldMode::Address => {
300 let default = data["def"].as_str().unwrap_or("");
301 let length = data["length"].as_usize().unwrap_or(500);
302 location::Address::new(require, field, title, length, default).sql(model)
303 }
304 FieldMode::Dict => {
305 let table = data["table"].as_str().unwrap();
306 let fields = data["fields"].as_str().unwrap_or("");
307 let api = data["api"].as_str().unwrap();
308 let default = data["def"].as_str().unwrap_or("");
309
310 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
311 dict::Dict::new(require, field, title, table, fields, api)
312 .multiple(multiple_count)
313 .default(default)
314 .sql(model)
315 }
316
317 FieldMode::Key
318 | FieldMode::Pass
319 | FieldMode::String
320 | FieldMode::Code
321 | FieldMode::BarCode
322 | FieldMode::Email
323 | FieldMode::Tel
324 | FieldMode::Ident
325 | FieldMode::Color
326 | FieldMode::QrCode => {
327 let default = data["def"].as_str().unwrap_or("");
328 let dec = data["dec"].as_str().unwrap_or("");
329 let length = data["length"].as_usize().unwrap_or(20);
330 match FieldMode::from(mode) {
331 FieldMode::Code => {
332 str::Code::new(require, field, title, length, dec, default).sql(model)
333 }
334 FieldMode::BarCode => str::BarCode::new(require, field, title, default).sql(model),
335 FieldMode::Email => str::Email::new(require, field, title, default).sql(model),
336 FieldMode::Tel => str::Tel::new(require, field, title, default).sql(model),
337 FieldMode::Ident => str::Ident::new(require, field, title, default).sql(model),
338 FieldMode::Color => str::Color::new(require, field, title, default).sql(model),
339 FieldMode::String => {
340 str::Str::new(require, field, title, length, default).sql(model)
341 }
342 FieldMode::Pass => {
343 str::Pass::new(require, field, title, length, default).sql(model)
344 }
345 FieldMode::Key => str::Key::new(true, field, title, length)
346 .auto(data["auto"].as_bool().unwrap())
347 .sql(model),
348 FieldMode::QrCode => {
349 str::QrCode::new(require, field, title, length, default).sql(model)
350 }
351 _ => str::Str::new(require, field, title, length, default).sql(model),
352 }
353 }
354 FieldMode::Polygon => {
355 let default = data["def"].clone();
356 let length = data["length"].as_i32().unwrap_or(0);
357 text::Array::new(require, field, title, default)
358 .length(length)
359 .sql(model)
360 }
361 };
362 row.to_string()
363}
364
365pub fn verify(field: &str, data: JsonValue) -> JsonValue {
367 let mode = data["mode"].as_str().unwrap();
368 let require = data["require"].as_bool().unwrap_or(false);
369 let title = data["title"].as_str().unwrap_or("未知标题");
370 let field_mode = FieldMode::from(mode);
371
372 match field_mode {
373 FieldMode::BarCode
374 | FieldMode::Pass
375 | FieldMode::Key
376 | FieldMode::String
377 | FieldMode::Color
378 | FieldMode::Tel
379 | FieldMode::Ident
380 | FieldMode::Email
381 | FieldMode::Code
382 | FieldMode::QrCode => {
383 let default = data["def"].as_str().unwrap_or("");
384 let length = data["length"].as_usize().unwrap_or(20);
385 match field_mode {
386 FieldMode::Key => str::Key::new(true, field, title, length)
387 .auto(data["auto"].as_bool().unwrap())
388 .verify(data),
389 FieldMode::Pass => {
390 str::Pass::new(require, field, title, length, default).verify(data)
391 }
392 FieldMode::String => {
393 str::Str::new(require, field, title, length, default).verify(data)
394 }
395 FieldMode::Color => str::Color::new(require, field, title, default).verify(data),
396 FieldMode::Tel => str::Tel::new(require, field, title, default).verify(data),
397 FieldMode::Ident => str::Ident::new(require, field, title, default).verify(data),
398 FieldMode::Email => str::Email::new(require, field, title, default).verify(data),
399 FieldMode::BarCode => {
400 str::BarCode::new(require, field, title, default).verify(data)
401 }
402 FieldMode::Code => {
403 let dec = data["dec"].as_str().unwrap_or("");
404 str::Code::new(require, field, title, length, dec, default).verify(data)
405 }
406 FieldMode::QrCode => {
407 str::QrCode::new(require, field, title, length, default).verify(data)
408 }
409 _ => str::Str::new(require, field, title, length, default).verify(data),
410 }
411 }
412 FieldMode::Table => {
413 let table = data["table"].as_str().unwrap();
414 let fields: Vec<&str> = data["fields"]
415 .members()
416 .map(|x| x.as_str().unwrap())
417 .collect();
418 let api = data["api"].as_str().unwrap();
419 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
420 table::Table::new(require, field, title, table, fields, api)
421 .multiple(multiple_count)
422 .verify(data)
423 }
424 FieldMode::Tree => {
425 let table = data["table"].as_str().unwrap();
426 let pid_field = data["pid_field"].as_str().unwrap_or("");
427 let fields: Vec<&str> = data["fields"]
428 .members()
429 .map(|x| x.as_str().unwrap())
430 .collect();
431 let api = data["api"].as_str().unwrap();
432 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
433 table::Tree::new(require, field, title, table, pid_field, fields, api)
434 .multiple(multiple_count)
435 .verify(data)
436 }
437 FieldMode::Text => {
438 let default = data["def"].as_str().unwrap_or("");
439 let length = data["length"].as_i32().unwrap_or(0);
440 text::Text::new(require, field, title, default)
441 .length(length)
442 .verify(data)
443 }
444 FieldMode::Editor => {
445 let default = data["def"].as_str().unwrap_or("");
446 let length = data["length"].as_i32().unwrap_or(0);
447 text::Editor::new(require, field, title, default)
448 .length(length)
449 .verify(data)
450 }
451 FieldMode::Json => {
452 let default = data["def"].clone();
453 let length = data["length"].as_i32().unwrap_or(0);
454 text::Object::new(require, field, title, default)
455 .length(length)
456 .verify(data)
457 }
458 FieldMode::Array | FieldMode::TableMultiple => {
459 let default = data["def"].clone();
460 let length = data["length"].as_i32().unwrap_or(0);
461 text::Array::new(require, field, title, default)
462 .length(length)
463 .verify(data)
464 }
465 FieldMode::Object => {
466 let default = data["def"].clone();
467 let length = data["length"].as_i32().unwrap_or(0);
468 text::Object::new(require, field, title, default)
469 .length(length)
470 .verify(data)
471 }
472 FieldMode::Url => {
473 let default = data["def"].as_str().unwrap_or("");
474 text::Url::new(require, field, title, default).verify(data)
475 }
476 FieldMode::Files => {
477 let length = data["length"].as_i32().unwrap_or(1);
478 let encrypt = data["encrypt"].as_bool().unwrap_or(false);
479 let size = data["size"].as_usize().unwrap_or(0);
480 let option: Vec<&str> = data["option"]
481 .members()
482 .map(|x| x.as_str().unwrap())
483 .collect();
484 let default = data["def"].as_str().unwrap_or("");
485
486 let mut files_mode = files::Files::new(require, field, title);
487
488 if length > 1 {
489 files_mode.multiple(length);
490 }
491 if encrypt {
492 files_mode.encrypt();
493 }
494 files_mode.def(default);
495 files_mode.size(size);
496 files_mode.option(option);
497 files_mode.verify(data)
498 }
499 FieldMode::Float => {
500 let length = data["length"].as_i32().unwrap();
501 let dec = data["dec"].as_usize().unwrap();
502 let default = data["def"].as_f64().unwrap();
503 float::Float::new(require, field, title, length, dec, default).verify(data)
504 }
505 FieldMode::Int => {
506 let length = data["length"].as_i32().unwrap();
507 let default = data["def"].as_i64().unwrap();
508 int::Int::new(require, field, title, length, default).verify(data)
509 }
510 FieldMode::Switch => {
511 let default = data["def"].to_string().parse::<u8>().unwrap();
512 let default = default == 1;
513 int::Switch::new(require, field, title, default).verify(data)
514 }
515 FieldMode::Year
516 | FieldMode::YearMonth
517 | FieldMode::Date
518 | FieldMode::Datetime
519 | FieldMode::Time
520 | FieldMode::Timestamp => {
521 let default = data["def"].as_str().unwrap_or("");
522 match field_mode {
523 FieldMode::Datetime => {
524 let default = data["def"].as_i64().unwrap_or(0);
525 datetime::Datetime::new(require, field, title, default).verify(data)
526 }
527 FieldMode::Year => datetime::Year::new(require, field, title, default).verify(data),
528 FieldMode::YearMonth => {
529 let default = data["def"].as_i64().unwrap_or(0);
530 datetime::YearMonth::new(require, field, title, default).verify(data)
531 }
532 FieldMode::Date => {
533 let default = data["def"].as_i64().unwrap_or(0);
534 datetime::Date::new(require, field, title, default).verify(data)
535 }
536 FieldMode::Time => datetime::Time::new(require, field, title, default).verify(data),
537 FieldMode::Timestamp => {
538 let dec = data["dec"].as_i32().unwrap();
539 let default = data["def"].as_f64().unwrap_or(0.0);
540 datetime::Timestamp::new(require, field, title, dec, default).verify(data)
541 }
542 _ => {
543 let default = data["def"].as_i64().unwrap_or(0);
544 datetime::Datetime::new(require, field, title, default).verify(data)
545 }
546 }
547 }
548
549 FieldMode::Select => {
550 let option: Vec<&str> = data["option"]
551 .members()
552 .map(|c| c.as_str().unwrap())
553 .collect();
554 let def: Vec<&str> = data["def"].members().map(|c| c.as_str().unwrap()).collect();
555 select::Select::new(require, field, title, option, def).verify(data)
556 }
557 FieldMode::Radio => {
558 let option: Vec<&str> = data["option"]
559 .members()
560 .map(|x| x.as_str().unwrap())
561 .collect();
562 select::Radio::new(require, field, title, option, data["def"].as_str().unwrap())
563 .verify(data)
564 }
565
566 FieldMode::Location => {
567 let default = data["def"].as_str().unwrap_or("");
568 location::Location::new(require, field, title)
569 .def(default)
570 .verify(data)
571 }
572 FieldMode::Address => {
573 let default = data["def"].as_str().unwrap_or("");
574 let length = data["length"].as_usize().unwrap_or(500);
575 location::Address::new(require, field, title, length, default).verify(data)
576 }
577 FieldMode::Dict => {
578 let table = data["table"].as_str().unwrap();
579 let fields = data["fields"].as_str().unwrap_or("");
580 let api = data["api"].as_str().unwrap();
581 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
582 dict::Dict::new(require, field, title, table, fields, api)
583 .multiple(multiple_count)
584 .verify(data)
585 }
586 FieldMode::Polygon => {
587 let default = data["def"].clone();
588 let length = data["length"].as_i32().unwrap_or(0);
589 text::Array::new(require, field, title, default)
590 .length(length)
591 .verify(data)
592 }
593 }
594}