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