1use std::path::Path;
7
8use crate::assembler::{Assembler, AssemblerConfig};
9use crate::parsing::parse_mig;
10use crate::tokenize::parse_to_segments;
11use crate::AssemblyError;
12use mig_types::schema::mig::MigSchema;
13
14pub struct ConversionService {
17 mig: MigSchema,
18}
19
20impl ConversionService {
21 pub fn new(
23 mig_path: &Path,
24 message_type: &str,
25 variant: Option<&str>,
26 format_version: &str,
27 ) -> Result<Self, AssemblyError> {
28 let mig = parse_mig(mig_path, message_type, variant, format_version)
29 .map_err(|e| AssemblyError::ParseError(e.to_string()))?;
30 Ok(Self { mig })
31 }
32
33 pub fn from_mig(mig: MigSchema) -> Self {
35 Self { mig }
36 }
37
38 pub fn convert_to_tree(&self, input: &str) -> Result<serde_json::Value, AssemblyError> {
40 let segments = parse_to_segments(input.as_bytes())?;
41 let assembler = Assembler::new(&self.mig);
42 let tree = assembler.assemble_generic(&segments)?;
43 serde_json::to_value(&tree).map_err(|e| AssemblyError::ParseError(e.to_string()))
44 }
45
46 pub fn convert_to_assembled_tree(
48 &self,
49 input: &str,
50 ) -> Result<crate::assembler::AssembledTree, AssemblyError> {
51 let segments = parse_to_segments(input.as_bytes())?;
52 let assembler = Assembler::new(&self.mig);
53 assembler.assemble_generic(&segments)
54 }
55
56 pub fn convert_interchange_to_trees(
66 &self,
67 input: &str,
68 ) -> Result<
69 (
70 crate::tokenize::InterchangeChunks,
71 Vec<crate::assembler::AssembledTree>,
72 ),
73 AssemblyError,
74 > {
75 let segments = parse_to_segments(input.as_bytes())?;
76 let chunks = crate::tokenize::split_messages(segments)?;
77
78 let mut trees = Vec::with_capacity(chunks.messages.len());
79 for msg in &chunks.messages {
80 let segs = msg.segments_for_mig(&self.mig);
81 let assembler = Assembler::new(&self.mig);
82 let tree = assembler.assemble_generic(&segs)?;
83 trees.push(tree);
84 }
85
86 Ok((chunks, trees))
87 }
88
89 pub fn convert_to_assembled_tree_with_config(
91 &self,
92 input: &str,
93 config: AssemblerConfig,
94 ) -> Result<crate::assembler::AssembledTree, AssemblyError> {
95 let segments = parse_to_segments(input.as_bytes())?;
96 let assembler = Assembler::with_config(&self.mig, config);
97 assembler.assemble_generic(&segments)
98 }
99
100 pub fn convert_interchange_to_trees_with_config(
102 &self,
103 input: &str,
104 config: AssemblerConfig,
105 ) -> Result<
106 (
107 crate::tokenize::InterchangeChunks,
108 Vec<crate::assembler::AssembledTree>,
109 ),
110 AssemblyError,
111 > {
112 let segments = parse_to_segments(input.as_bytes())?;
113 let chunks = crate::tokenize::split_messages(segments)?;
114
115 let mut trees = Vec::with_capacity(chunks.messages.len());
116 for msg in &chunks.messages {
117 let segs = msg.segments_for_mig(&self.mig);
118 let assembler = Assembler::with_config(&self.mig, config.clone());
119 let tree = assembler.assemble_generic(&segs)?;
120 trees.push(tree);
121 }
122
123 Ok((chunks, trees))
124 }
125
126 pub fn convert_interchange_to_trees_with_diagnostics(
136 &self,
137 input: &str,
138 config: AssemblerConfig,
139 ) -> Result<
140 (
141 crate::tokenize::InterchangeChunks,
142 Vec<crate::assembler::AssembledTree>,
143 Vec<crate::StructureDiagnostic>,
144 ),
145 AssemblyError,
146 > {
147 let segments = parse_to_segments(input.as_bytes())?;
148 let chunks = crate::tokenize::split_messages(segments)?;
149
150 let mut trees = Vec::with_capacity(chunks.messages.len());
151 let mut diagnostics = Vec::new();
152 for msg in &chunks.messages {
153 let segs = msg.segments_for_mig(&self.mig);
154 let assembler = Assembler::with_config(&self.mig, config.clone());
155 let (tree, diags) = assembler.assemble_with_diagnostics(&segs);
156 trees.push(tree);
157 diagnostics.extend(diags);
158 }
159
160 Ok((chunks, trees, diagnostics))
161 }
162
163 pub fn mig(&self) -> &MigSchema {
165 &self.mig
166 }
167}