br_fields/
lib.rs

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