Skip to main content

wpl/generator/
fmt.rs

1use wp_model_core::model::{DataField, DataRecord, DataType};
2use wp_primitives::WResult as ModalResult;
3
4use crate::{WplSep, ast::fld_fmt::WplFieldFmt};
5
6pub struct JsonGenFmt<T>(pub T);
7pub struct RAWGenFmt<T>(pub T);
8pub struct CSVGenFmt<T>(pub T);
9pub struct KVGenFmt<T>(pub T);
10pub struct ProtoGenFmt<T>(pub T);
11
12pub struct GenChannel {
13    pub rng: rand::rngs::ThreadRng,
14}
15
16impl GenChannel {
17    pub fn new() -> Self {
18        Self { rng: rand::rng() }
19    }
20}
21impl Default for GenChannel {
22    fn default() -> Self {
23        Self::new()
24    }
25}
26
27pub trait ParserValue<T> {
28    fn parse_value(data: &mut &str) -> ModalResult<T>;
29}
30
31//pub type FmtField = (Meta, DataField, FieldFmt, WPLSep);
32#[derive(Debug, Clone)]
33pub struct FmtField {
34    pub meta: DataType,
35    pub data_field: DataField,
36    pub field_fmt: WplFieldFmt,
37    pub sep: WplSep,
38}
39
40impl FmtField {
41    pub fn new(meta: DataType, data_field: DataField, field_fmt: WplFieldFmt, sep: WplSep) -> Self {
42        Self {
43            meta,
44            data_field,
45            field_fmt,
46            sep,
47        }
48    }
49}
50
51pub type FmtFieldVec = Vec<FmtField>;
52
53pub fn record_from_fmt_fields(fields: FmtFieldVec) -> DataRecord {
54    let mut data_fields = Vec::new();
55
56    for field in fields {
57        data_fields.push(wp_model_core::model::FieldStorage::from_owned(
58            field.data_field,
59        ));
60    }
61    DataRecord::from(data_fields)
62}
63
64mod field_vec_fmt {
65    use std::fmt::{Display, Formatter};
66
67    use super::{CSVGenFmt, JsonGenFmt, KVGenFmt, ProtoGenFmt, RAWGenFmt};
68    use crate::ast::GenFmt;
69    use crate::eval::vof;
70    use crate::generator::{FmtFieldVec, record_from_fmt_fields};
71    use wp_data_fmt::{
72        Csv, FormatType, Json, KeyValue, ProtoTxt, Raw, RecordFormatter, ValueFormatter,
73    };
74    use wp_model_core::model::{DataType, FieldStorage};
75
76    impl Display for KVGenFmt<&FmtFieldVec> {
77        fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
78            let fmt = KeyValue::default();
79            write!(
80                f,
81                "{}",
82                fmt.fmt_record(&record_from_fmt_fields(self.0.clone()))
83            )
84        }
85    }
86
87    impl Display for RAWGenFmt<&FmtFieldVec> {
88        fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
89            let len = self.0.len();
90            let kvfmt = KeyValue::default();
91            let rawfmt = Raw;
92            for (i, fmt_field) in self
93                .0
94                .iter()
95                .filter(|fmt_f| *fmt_f.data_field.get_meta() != DataType::Ignore)
96                .enumerate()
97            {
98                write!(f, "{}", vof(fmt_field.field_fmt.scope_beg.clone(), ""))?;
99                if let Some(fmt) = &fmt_field.field_fmt.sub_fmt {
100                    let formatter = FormatType::from(fmt);
101                    write!(
102                        f,
103                        "{}",
104                        formatter.format_value(fmt_field.data_field.get_value())
105                    )?;
106                } else {
107                    match fmt_field.meta {
108                        DataType::KV => {
109                            // Wrap DataField as FieldStorage for fmt_field
110                            let storage = FieldStorage::from_owned(fmt_field.data_field.clone());
111                            write!(f, "{}", kvfmt.fmt_field(&storage))?;
112                        }
113                        _ => {
114                            // Wrap DataField as FieldStorage for fmt_field
115                            let storage = FieldStorage::from_owned(fmt_field.data_field.clone());
116                            write!(f, "{}", rawfmt.fmt_field(&storage))?;
117                        }
118                    }
119                }
120
121                write!(f, "{}", vof(fmt_field.field_fmt.scope_end.clone(), ""))?;
122                if i != len - 1 {
123                    write!(f, "{}", GenFmt(&fmt_field.sep))?;
124                }
125            }
126            Ok(())
127        }
128    }
129
130    impl Display for CSVGenFmt<&FmtFieldVec> {
131        fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
132            let fmt = Csv::default();
133            write!(
134                f,
135                "{}",
136                fmt.fmt_record(&record_from_fmt_fields(self.0.clone()))
137            )
138        }
139    }
140
141    impl Display for JsonGenFmt<&FmtFieldVec> {
142        fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
143            let fmt = Json;
144            write!(
145                f,
146                "{}",
147                fmt.fmt_record(&record_from_fmt_fields(self.0.clone()))
148            )
149        }
150    }
151
152    impl Display for ProtoGenFmt<&FmtFieldVec> {
153        fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
154            let fmt = ProtoTxt;
155            write!(
156                f,
157                "{}",
158                fmt.fmt_record(&record_from_fmt_fields(self.0.clone()))
159            )
160        }
161    }
162}