wpl/eval/value/
data_type.rs1use 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}