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#[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 let storage = FieldStorage::from_owned(fmt_field.data_field.clone());
111 write!(f, "{}", kvfmt.fmt_field(&storage))?;
112 }
113 _ => {
114 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}