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 pid_field = data["pid_field"].as_str().unwrap();
138 let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
139 let api = data["api"].as_str().unwrap();
140 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
141 table::Tree::new(require, field, title, table, pid_field, fields, api).multiple(multiple_count).sql(model)
142 }
143 FieldMode::Text => {
144 let default = data["def"].as_str().unwrap_or("");
145 let length = data["length"].as_i32().unwrap_or(0);
146 text::Text::new(require, field, title, default).length(length).sql(model)
147 }
148 FieldMode::Editor => {
149 let default = data["def"].as_str().unwrap_or("");
150 let length = data["length"].as_i32().unwrap_or(0);
151 text::Editor::new(require, field, title, default).length(length).sql(model)
152 }
153 FieldMode::Json => {
154 let default = data["def"].clone();
155 let length = data["length"].as_i32().unwrap_or(0);
156 text::Json::new(require, field, title, default).length(length).sql(model)
157 }
158 FieldMode::Array => {
159 let default = data["def"].clone();
160 let length = data["length"].as_i32().unwrap_or(0);
161 text::Array::new(require, field, title, default).length(length).sql(model)
162 }
163 FieldMode::Object => {
164 let default = data["def"].clone();
165 let length = data["length"].as_i32().unwrap_or(0);
166 text::Object::new(require, field, title, default).length(length).sql(model)
167 }
168 FieldMode::Url => {
169 let default = data["def"].as_str().unwrap_or("");
170 text::Url::new(require, field, title, default).sql(model)
171 }
172 FieldMode::Files => {
173 let length = data["length"].as_i32().unwrap_or(1);
174 let encrypt = data["encrypt"].as_bool().unwrap_or(false);
175 let size = data["size"].as_usize().unwrap_or(0);
176 let default = data["def"].as_str().unwrap_or("");
177 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
178 let mut files_mode = files::Files::new(require, field, title);
179
180 if length > 1 {
181 files_mode.multiple(length);
182 }
183 if encrypt {
184 files_mode.encrypt();
185 }
186 files_mode.def(default);
187 files_mode.size(size);
188 files_mode.option(option);
189 files_mode.sql(model)
190 }
191 FieldMode::Float => {
192 let length = data["length"].as_i32().unwrap();
193 let dec = data["dec"].as_usize().unwrap();
194 let default = data["def"].to_string().parse::<f64>().unwrap_or(0.0);
195 float::Float::new(require, field, title, length, dec, default).sql(model)
196 }
197 FieldMode::Int => {
198 let length = data["length"].as_i32().unwrap();
199 let default = data["def"].as_i64().unwrap();
200 int::Int::new(require, field, title, length, default).sql(model)
201 }
202 FieldMode::Switch => {
203 let default = data["def"].to_string().parse::<bool>().unwrap();
204 int::Switch::new(require, field, title, default).sql(model)
205 }
206 FieldMode::Datetime => {
207 let default = data["def"].as_str().unwrap_or("");
208 datetime::Datetime::new(require, field, title, default).sql(model)
209 }
210 FieldMode::Year => {
211 let default = data["def"].as_str().unwrap_or("");
212 datetime::Year::new(require, field, title, default).sql(model)
213 }
214 FieldMode::Date => {
215 let default = data["def"].as_str().unwrap();
216 datetime::Date::new(require, field, title, default).sql(model)
217 }
218 FieldMode::Time => {
219 let default = data["def"].as_str().unwrap();
220 datetime::Time::new(require, field, title, default).sql(model)
221 }
222 FieldMode::Timestamp => {
223 let dec = data["dec"].as_i32().unwrap();
224 let default = data["def"].as_f64().unwrap_or(0.0);
225 datetime::Timestamp::new(require, field, title, dec, default).sql(model)
226 }
227 FieldMode::Select => {
228 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
229
230 let def: Vec<&str> = data["def"].members().map(|x| x.as_str().unwrap()).collect();
231
232 select::Select::new(require, field, title, option, def).table_name(data["table_name"].as_str().unwrap_or("")).sql(model)
233 }
234 FieldMode::Radio => {
235 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
236 select::Radio::new(require, field, title, option, data["def"].as_str().unwrap()).table_name(data["table_name"].as_str().unwrap_or("")).sql(model)
237 }
238 FieldMode::Location => {
239 let default = data["def"].as_str().unwrap_or("");
240 location::Location::new(require, field, title).def(default).sql(model)
241 }
242 FieldMode::Dict => {
243 let table = data["table"].as_str().unwrap();
244 let fields = data["fields"].as_str().unwrap_or("");
245 let api = data["api"].as_str().unwrap();
246 let default = data["def"].as_str().unwrap_or("");
247
248 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
249 dict::Dict::new(require, field, title, table, fields, api).multiple(multiple_count).default(default).sql(model)
250 }
251
252 FieldMode::Key | FieldMode::Pass | FieldMode::String | FieldMode::Code | FieldMode::BarCode | FieldMode::Email | FieldMode::Tel | FieldMode::Ident | FieldMode::Color | FieldMode::QrCode => {
253 let default = data["def"].as_str().unwrap_or("");
254 let dec = data["dec"].as_str().unwrap_or("");
255 let length = data["length"].as_usize().unwrap_or(20);
256 match FieldMode::from(mode) {
257 FieldMode::Code => {
258 str::Code::new(require, field, title, length, dec, default).sql(model)
259 }
260 FieldMode::BarCode => str::BarCode::new(require, field, title, default).sql(model),
261 FieldMode::Email => str::Email::new(require, field, title, default).sql(model),
262 FieldMode::Tel => str::Tel::new(require, field, title, default).sql(model),
263 FieldMode::Ident => str::Ident::new(require, field, title, default).sql(model),
264 FieldMode::Color => str::Color::new(require, field, title, default).sql(model),
265 FieldMode::String => {
266 str::Str::new(require, field, title, length, default).sql(model)
267 }
268 FieldMode::Pass => {
269 str::Pass::new(require, field, title, length, default).sql(model)
270 }
271 FieldMode::Key => str::Key::new(true, field, title, length).auto(data["auto"].as_bool().unwrap()).sql(model),
272 FieldMode::QrCode => {
273 str::QrCode::new(require, field, title, length, default).sql(model)
274 }
275 _ => str::Str::new(require, field, title, length, default).sql(model),
276 }
277 }
278 FieldMode::Polygon => {
279 let default = data["def"].clone();
280 let length = data["length"].as_i32().unwrap_or(0);
281 text::Array::new(require, field, title, default).length(length).sql(model)
282 }
283 };
284 row.to_string()
285}
286
287pub fn verify(field: &str, data: JsonValue) -> JsonValue {
289 let mode = data["mode"].as_str().unwrap();
290 let require = data["require"].as_bool().unwrap_or(false);
291 let title = data["title"].as_str().unwrap_or("未知标题");
292 let field_mode = FieldMode::from(mode);
293
294 match field_mode {
295 FieldMode::BarCode | FieldMode::Pass | FieldMode::Key | FieldMode::String | FieldMode::Color | FieldMode::Tel | FieldMode::Ident | FieldMode::Email | FieldMode::Code | FieldMode::QrCode => {
296 let default = data["def"].as_str().unwrap_or("");
297 let length = data["length"].as_usize().unwrap_or(20);
298 match field_mode {
299 FieldMode::Key => str::Key::new(true, field, title, length).auto(data["auto"].as_bool().unwrap()).verify(data),
300 FieldMode::Pass => {
301 str::Pass::new(require, field, title, length, default).verify(data)
302 }
303 FieldMode::String => {
304 str::Str::new(require, field, title, length, default).verify(data)
305 }
306 FieldMode::Color => str::Color::new(require, field, title, default).verify(data),
307 FieldMode::Tel => str::Tel::new(require, field, title, default).verify(data),
308 FieldMode::Ident => str::Ident::new(require, field, title, default).verify(data),
309 FieldMode::Email => str::Email::new(require, field, title, default).verify(data),
310 FieldMode::BarCode => {
311 str::BarCode::new(require, field, title, default).verify(data)
312 }
313 FieldMode::Code => {
314 let dec = data["dec"].as_str().unwrap_or("");
315 str::Code::new(require, field, title, length, dec, default).verify(data)
316 }
317 FieldMode::QrCode => {
318 str::QrCode::new(require, field, title, length, default).verify(data)
319 }
320 _ => str::Str::new(require, field, title, length, default).verify(data),
321 }
322 }
323 FieldMode::Table => {
324 let table = data["table"].as_str().unwrap();
325 let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
326 let api = data["api"].as_str().unwrap();
327 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
328 table::Table::new(require, field, title, table, fields, api).multiple(multiple_count).verify(data)
329 }
330 FieldMode::Tree => {
331 let table = data["table"].as_str().unwrap();
332 let pid_field = data["pid_field"].as_str().unwrap_or("");
333 let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
334 let api = data["api"].as_str().unwrap();
335 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
336 table::Tree::new(require, field, title, table, pid_field, fields, api).multiple(multiple_count).verify(data)
337 }
338 FieldMode::Text => {
339 let default = data["def"].as_str().unwrap_or("");
340 let length = data["length"].as_i32().unwrap_or(0);
341 text::Text::new(require, field, title, default).length(length).verify(data)
342 }
343 FieldMode::Editor => {
344 let default = data["def"].as_str().unwrap_or("");
345 let length = data["length"].as_i32().unwrap_or(0);
346 text::Editor::new(require, field, title, default).length(length).verify(data)
347 }
348 FieldMode::Json => {
349 let default = data["def"].clone();
350 let length = data["length"].as_i32().unwrap_or(0);
351 text::Json::new(require, field, title, default).length(length).verify(data)
352 }
353 FieldMode::Array => {
354 let default = data["def"].clone();
355 let length = data["length"].as_i32().unwrap_or(0);
356 text::Array::new(require, field, title, default).length(length).verify(data)
357 }
358 FieldMode::Object => {
359 let default = data["def"].clone();
360 let length = data["length"].as_i32().unwrap_or(0);
361 text::Object::new(require, field, title, default).length(length).verify(data)
362 }
363 FieldMode::Url => {
364 let default = data["def"].as_str().unwrap_or("");
365 text::Url::new(require, field, title, default).verify(data)
366 }
367 FieldMode::Files => {
368 let length = data["length"].as_i32().unwrap_or(1);
369 let encrypt = data["encrypt"].as_bool().unwrap_or(false);
370 let size = data["size"].as_usize().unwrap_or(0);
371 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
372 let default = data["def"].as_str().unwrap_or("");
373
374 let mut files_mode = files::Files::new(require, field, title);
375
376 if length > 1 {
377 files_mode.multiple(length);
378 }
379 if encrypt {
380 files_mode.encrypt();
381 }
382 files_mode.def(default);
383 files_mode.size(size);
384 files_mode.option(option);
385 files_mode.verify(data)
386 }
387 FieldMode::Float => {
388 let length = data["length"].as_i32().unwrap();
389 let dec = data["dec"].as_usize().unwrap();
390 let default = data["def"].as_f64().unwrap();
391 float::Float::new(require, field, title, length, dec, default).verify(data)
392 }
393 FieldMode::Int => {
394 let length = data["length"].as_i32().unwrap();
395 let default = data["def"].as_i64().unwrap();
396 int::Int::new(require, field, title, length, default).verify(data)
397 }
398 FieldMode::Switch => {
399 let default = data["def"].to_string().parse::<u8>().unwrap();
400 let default = default == 1;
401 int::Switch::new(require, field, title, default).verify(data)
402 }
403 FieldMode::Year | FieldMode::Date | FieldMode::Datetime | FieldMode::Time | FieldMode::Timestamp => {
404 let default = data["def"].as_str().unwrap_or("");
405 match field_mode {
406 FieldMode::Datetime => {
407 datetime::Datetime::new(require, field, title, default).verify(data)
408 }
409 FieldMode::Year => datetime::Year::new(require, field, title, default).verify(data),
410 FieldMode::Date => datetime::Date::new(require, field, title, default).verify(data),
411 FieldMode::Time => datetime::Time::new(require, field, title, default).verify(data),
412 FieldMode::Timestamp => {
413 let dec = data["dec"].as_i32().unwrap();
414 let default = data["def"].as_f64().unwrap_or(0.0);
415 datetime::Timestamp::new(require, field, title, dec, default).verify(data)
416 }
417 _ => datetime::Datetime::new(require, field, title, default).verify(data),
418 }
419 }
420
421 FieldMode::Select => {
422 let option: Vec<&str> = data["option"].members().map(|c| c.as_str().unwrap()).collect();
423 let def: Vec<&str> = data["def"].members().map(|c| c.as_str().unwrap()).collect();
424 select::Select::new(require, field, title, option, def).verify(data)
425 }
426 FieldMode::Radio => {
427 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
428 select::Radio::new(require, field, title, option, data["def"].as_str().unwrap()).verify(data)
429 }
430
431 FieldMode::Location => {
432 let default = data["def"].as_str().unwrap_or("");
433 location::Location::new(require, field, title).def(default).verify(data)
434 }
435 FieldMode::Dict => {
436 let table = data["table"].as_str().unwrap();
437 let fields = data["fields"].as_str().unwrap_or("");
438 let api = data["api"].as_str().unwrap();
439 let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
440 dict::Dict::new(require, field, title, table, fields, api).multiple(multiple_count).verify(data)
441 }
442 FieldMode::Polygon => {
443 let default = data["def"].clone();
444 let length = data["length"].as_i32().unwrap_or(0);
445 text::Array::new(require, field, title, default).length(length).verify(data)
446 }
447 }
448}