Skip to main content

wpl/eval/value/
data_type.rs

1use std::fmt::Display;
2use std::net::{IpAddr, Ipv4Addr};
3use std::str::FromStr;
4
5use crate::eval::value::parser::physical::time::parse_time;
6use wp_model_core::model::DataType;
7use wp_model_core::model::FNameStr;
8use wp_model_core::model::FValueStr;
9use wp_model_core::model::data::Field;
10use wp_model_core::model::error::ModelError;
11use wp_model_core::model::{DateTimeValue, Maker, Value};
12
13pub trait DataTypeParser {
14    fn from_str<N: Into<FNameStr>, V: Into<FValueStr> + Display>(
15        meta: DataType,
16        name: N,
17        value: V,
18    ) -> Result<Self, ModelError>
19    where
20        Self: Sized;
21}
22
23impl<T> DataTypeParser for Field<T>
24where
25    T: Maker<FValueStr>,
26    T: Maker<i64>,
27    T: Maker<f64>,
28    T: Maker<IpAddr>,
29    T: Maker<bool>,
30    T: Maker<DateTimeValue>,
31    T: Maker<Value>,
32{
33    fn from_str<N: Into<FNameStr>, V: Into<FValueStr> + Display>(
34        meta: DataType,
35        name: N,
36        value: V,
37    ) -> Result<Self, ModelError> {
38        match meta {
39            DataType::Chars => Ok(Field::<T>::from_chars(name.into(), value.into())),
40            DataType::Symbol => Ok(Field::<T>::from_symbol(name.into(), value.into())),
41            DataType::Digit => {
42                let value = value
43                    .into()
44                    .parse::<i64>()
45                    .map_err(|e| ModelError::Parse(e.to_string()))?;
46                Ok(Field::<T>::from_digit(name.into(), value))
47            }
48            DataType::Float => {
49                let value = value
50                    .into()
51                    .parse::<f64>()
52                    .map_err(|e| ModelError::Parse(e.to_string()))?;
53                Ok(Field::<T>::from_float(name.into(), value))
54            }
55            DataType::IP => {
56                let value = Ipv4Addr::from_str(value.into().as_str())
57                    .map_err(|e| ModelError::Parse(e.to_string()))?;
58                Ok(Field::<T>::from_ip(name.into(), IpAddr::V4(value)))
59            }
60            DataType::Bool => {
61                let value = bool::from_str(value.into().as_str())
62                    .map_err(|e| ModelError::Parse(e.to_string()))?;
63                Ok(Field::<T>::from_bool(name.into(), value))
64            }
65            DataType::Time => {
66                let code: FValueStr = value.into().clone();
67                Ok(Field::<T>::from_time(
68                    name.into(),
69                    parse_time(&mut code.as_str())
70                        .map_err(|_| ModelError::Parse(format!("{} parse error", "time")))?,
71                ))
72            }
73            _ => Err(ModelError::Parse(format!(
74                "TDOEnum::from_str not support meta:{}",
75                meta
76            ))),
77        }
78    }
79}