use std::path::Path;
use crate::assembler::{Assembler, AssemblerConfig};
use crate::parsing::parse_mig;
use crate::tokenize::parse_to_segments;
use crate::AssemblyError;
use mig_types::schema::mig::MigSchema;
pub struct ConversionService {
mig: MigSchema,
}
impl ConversionService {
pub fn new(
mig_path: &Path,
message_type: &str,
variant: Option<&str>,
format_version: &str,
) -> Result<Self, AssemblyError> {
let mig = parse_mig(mig_path, message_type, variant, format_version)
.map_err(|e| AssemblyError::ParseError(e.to_string()))?;
Ok(Self { mig })
}
pub fn from_mig(mig: MigSchema) -> Self {
Self { mig }
}
pub fn convert_to_tree(&self, input: &str) -> Result<serde_json::Value, AssemblyError> {
let segments = parse_to_segments(input.as_bytes())?;
let assembler = Assembler::new(&self.mig);
let tree = assembler.assemble_generic(&segments)?;
serde_json::to_value(&tree).map_err(|e| AssemblyError::ParseError(e.to_string()))
}
pub fn convert_to_assembled_tree(
&self,
input: &str,
) -> Result<crate::assembler::AssembledTree, AssemblyError> {
let segments = parse_to_segments(input.as_bytes())?;
let assembler = Assembler::new(&self.mig);
assembler.assemble_generic(&segments)
}
pub fn convert_interchange_to_trees(
&self,
input: &str,
) -> Result<
(
crate::tokenize::InterchangeChunks,
Vec<crate::assembler::AssembledTree>,
),
AssemblyError,
> {
let segments = parse_to_segments(input.as_bytes())?;
let chunks = crate::tokenize::split_messages(segments)?;
let mut trees = Vec::with_capacity(chunks.messages.len());
for msg in &chunks.messages {
let segs = msg.segments_for_mig(&self.mig);
let assembler = Assembler::new(&self.mig);
let tree = assembler.assemble_generic(&segs)?;
trees.push(tree);
}
Ok((chunks, trees))
}
pub fn convert_to_assembled_tree_with_config(
&self,
input: &str,
config: AssemblerConfig,
) -> Result<crate::assembler::AssembledTree, AssemblyError> {
let segments = parse_to_segments(input.as_bytes())?;
let assembler = Assembler::with_config(&self.mig, config);
assembler.assemble_generic(&segments)
}
pub fn convert_interchange_to_trees_with_config(
&self,
input: &str,
config: AssemblerConfig,
) -> Result<
(
crate::tokenize::InterchangeChunks,
Vec<crate::assembler::AssembledTree>,
),
AssemblyError,
> {
let segments = parse_to_segments(input.as_bytes())?;
let chunks = crate::tokenize::split_messages(segments)?;
let mut trees = Vec::with_capacity(chunks.messages.len());
for msg in &chunks.messages {
let segs = msg.segments_for_mig(&self.mig);
let assembler = Assembler::with_config(&self.mig, config.clone());
let tree = assembler.assemble_generic(&segs)?;
trees.push(tree);
}
Ok((chunks, trees))
}
pub fn mig(&self) -> &MigSchema {
&self.mig
}
}