vertigo_forms/
lib.rs

1use std::{collections::HashMap, fmt::Display, str::FromStr};
2
3mod drop_image_file;
4pub mod form;
5mod input;
6pub mod login;
7mod popup;
8mod search_panel;
9mod select;
10mod select_search;
11mod spinner;
12mod switch;
13mod tabs;
14mod with_loader;
15
16pub use {
17    drop_image_file::{DropImageFile, DropImageFileParams, image_as_uri, name_to_mime},
18    input::{Input, InputWithButton, InputWithButtonParams, ListInput},
19    popup::{Popup, PopupOnHover, PopupParams},
20    search_panel::{SearchPanel, SearchPanelParams, SearchResult},
21    select::{DictSelect, MultiDropDown, MultiDropDownParams, MultiSelect, Select},
22    select_search::{SelectSearch, SelectSearchParams},
23    spinner::Spinner,
24    switch::{Switch, SwitchParams},
25    tabs::{Tab, Tabs, TabsContent, TabsContentMapped, TabsHeader, TabsParams},
26    with_loader::{WithLoader, with_loader},
27};
28
29pub type ValidationErrors = HashMap<String, String>;
30
31pub fn parse<T>(value: String, field: &'static str, errors: &mut ValidationErrors) -> Option<T>
32where
33    T: FromStr,
34    <T as FromStr>::Err: Display,
35{
36    match value.parse() {
37        Ok(price) => Some(price),
38        Err(err) => {
39            errors.insert(field.to_string(), err.to_string());
40            None
41        }
42    }
43}
44
45pub fn nonify(value: String) -> Option<String> {
46    Some(value).filter(|v| !v.trim().is_empty())
47}
48
49pub fn parse_optional<T>(
50    value: String,
51    field: &'static str,
52    errors: &mut ValidationErrors,
53) -> Option<T>
54where
55    T: FromStr,
56    <T as FromStr>::Err: Display,
57{
58    match nonify(value) {
59        Some(value) => parse(value, field, errors),
60        None => None,
61    }
62}