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 all_segments = msg.all_segments();
81 let assembler = Assembler::new(&self.mig);
82 let tree = assembler.assemble_generic(&all_segments)?;
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 all_segments = msg.all_segments();
118 let assembler = Assembler::with_config(&self.mig, config.clone());
119 let tree = assembler.assemble_generic(&all_segments)?;
120 trees.push(tree);
121 }
122
123 Ok((chunks, trees))
124 }
125
126 pub fn mig(&self) -> &MigSchema {
128 &self.mig
129 }
130}