use crate::error::ParseError;
use ddex_core::models::flat::ParsedERNMessage;
use ddex_core::models::graph::ERNMessage;
use crate::parser::detector::{ERNVersion, VersionDetector};
use crate::transform::version_adapter::VersionAdapter;
use std::io::{BufRead, Seek};
pub struct VersionAwareParser;
impl VersionAwareParser {
pub fn parse<R: BufRead + Seek>(
mut reader: R,
) -> Result<ParsedERNMessage, ParseError> {
let version = VersionDetector::detect(&mut reader)?;
reader.seek(std::io::SeekFrom::Start(0))?;
let adapter = VersionAdapter::new(version);
let graph = match version {
ERNVersion::V3_8_2 => Self::parse_382(reader, adapter)?,
ERNVersion::V4_2 => Self::parse_42(reader, adapter)?,
ERNVersion::V4_3 => Self::parse_43(reader, adapter)?,
};
use crate::transform::flatten::Flattener;
let flat = Flattener::flatten(graph.clone());
Ok(ParsedERNMessage { graph, flat })
}
fn parse_382<R: BufRead>(
reader: R,
adapter: VersionAdapter,
) -> Result<ERNMessage, ParseError> {
todo!("Implement 3.8.2 parsing")
}
fn parse_42<R: BufRead>(
reader: R,
adapter: VersionAdapter,
) -> Result<ERNMessage, ParseError> {
todo!("Implement 4.2 parsing")
}
fn parse_43<R: BufRead>(
reader: R,
adapter: VersionAdapter,
) -> Result<ERNMessage, ParseError> {
todo!("Implement 4.3 parsing")
}
}