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