Skip to main content

wpl/eval/value/parser/
factory.rs

1use orion_error::{ContextRecord, ErrorOweBase, ErrorWith, WithContext};
2
3use crate::eval::value::parse_def::{Hold, ParserHold};
4use crate::eval::value::parser::base::digit::{DigitP, FloatP};
5use crate::eval::value::parser::base::hex::HexDigitP;
6use crate::eval::value::parser::base::*;
7use crate::eval::value::parser::compute::device::SnP;
8use crate::eval::value::parser::network::http;
9use crate::eval::value::parser::network::net::{IpNetP, IpPSR};
10use crate::eval::value::parser::physical::time::{
11    TimeCLF, TimeISOP, TimeP, TimeRFC2822, TimeRFC3339, TimeStampPSR,
12};
13use crate::eval::value::parser::protocol::array::ArrayP;
14use crate::eval::value::parser::protocol::base64::Base64P;
15use crate::eval::value::parser::protocol::json::JsonP;
16use crate::eval::value::parser::protocol::json_exact::ExactJsonP;
17use crate::eval::value::parser::protocol::keyval::KeyValP;
18use crate::eval::value::parser::protocol::kvarr::KvArrP;
19use crate::eval::value::parser::protocol::proto_text::ProtoTextP;
20use crate::parser::error::{WplCodeError, WplCodeReason, WplCodeResult};
21use wp_model_core::model::DataType;
22
23use super::auto::CombinedParser;
24#[derive(Default)]
25pub struct ParserFactory {}
26
27impl ParserFactory {
28    pub fn crate_auto() -> WplCodeResult<ParserHold> {
29        let mut parse = CombinedParser::new();
30        parse.ps.push(ParserFactory::create(&DataType::Json)?);
31        parse.ps.push(ParserFactory::create(&DataType::Time)?);
32        parse.ps.push(ParserFactory::create(&DataType::IP)?);
33        parse.ps.push(ParserFactory::create(&DataType::KV)?);
34        parse.ps.push(ParserFactory::create(&DataType::Float)?);
35        parse.ps.push(ParserFactory::create(&DataType::Digit)?);
36        parse.ps.push(ParserFactory::create(&DataType::Hex)?);
37        parse.ps.push(ParserFactory::create(&DataType::Chars)?);
38        Ok(Hold::new(parse))
39    }
40
41    pub fn create_simple(meta: &DataType) -> Option<ParserHold> {
42        match *meta {
43            DataType::Bool => Some(Hold::new(BoolP::default())),
44            DataType::Chars => Some(Hold::new(CharsP::default())),
45            DataType::Symbol => Some(Hold::new(SymbolP::default())),
46            DataType::PeekSymbol => Some(Hold::new(PeekSymbolP::default())),
47            DataType::Digit => Some(Hold::new(DigitP::default())),
48            DataType::Float => Some(Hold::new(FloatP::default())),
49            DataType::Ignore => Some(Hold::new(IgnoreP::default())),
50            DataType::Time => Some(Hold::new(TimeP::default())),
51            DataType::TimeCLF => Some(Hold::new(TimeCLF::default())),
52            DataType::TimeISO => Some(Hold::new(TimeISOP::default())),
53            DataType::TimeRFC3339 => Some(Hold::new(TimeRFC3339::default())),
54            DataType::TimeRFC2822 => Some(Hold::new(TimeRFC2822::default())),
55            DataType::TimeTIMESTAMP => Some(Hold::new(TimeStampPSR::default())),
56            DataType::IP => Some(Hold::new(IpPSR::default())),
57            DataType::IpNet => Some(Hold::new(IpNetP::default())),
58            DataType::Port => Some(Hold::new(DigitP::default())),
59            DataType::SN => Some(Hold::new(SnP::default())),
60            DataType::Hex => Some(Hold::new(HexDigitP::default())),
61            DataType::Base64 => Some(Hold::new(Base64P::default())),
62            DataType::KvArr => Some(Hold::new(KvArrP::default())),
63            DataType::KV => Some(Hold::new(KeyValP::default())),
64            DataType::Json => Some(Hold::new(JsonP::default())),
65            DataType::ExactJson => Some(Hold::new(ExactJsonP::default())),
66            DataType::HttpRequest => Some(Hold::new(http::RequestP::default())),
67            DataType::HttpStatus => Some(Hold::new(http::StatusP::default())),
68            DataType::HttpAgent => Some(Hold::new(http::AgentP::default())),
69            DataType::HttpMethod => Some(Hold::new(http::MethodP::default())),
70            DataType::ProtoText => Some(Hold::new(ProtoTextP::default())),
71            _ => None,
72        }
73    }
74
75    fn create_l1(meta: &DataType) -> WplCodeResult<ParserHold> {
76        let mut ctx = WithContext::want("create parser");
77        ctx.record("meta", meta.to_string());
78        if let Some(hold) = Self::create_simple(meta) {
79            return Ok(hold);
80        } else if DataType::Auto == *meta {
81            return Self::crate_auto();
82        }
83        Err(WplCodeError::from(WplCodeReason::UnSupport(
84            meta.to_string(),
85        )))
86        .with(&ctx)
87    }
88
89    pub fn create(meta: &DataType) -> WplCodeResult<ParserHold> {
90        let mut ctx = WithContext::want("create parser");
91        ctx.record("meta", meta.to_string());
92        if let DataType::Array(next_name) = meta {
93            let sub_meta = DataType::from(next_name.as_str())
94                .owe(WplCodeReason::UnSupport(next_name.into()))
95                .with(&ctx)?;
96            match Self::create(&sub_meta) {
97                Ok(_) => Ok(Hold::new(ArrayP::new())),
98                Err(e) => Err(e),
99            }
100        } else {
101            Self::create_l1(meta)
102        }
103    }
104}