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