mod adapter;
mod decode;
mod listforge;
mod resolve;
mod types;
pub use adapter::{select_adapter, FormatAdapter, ParseError};
pub use decode::{decode_listforge, DecodeError};
pub use listforge::ListForgeAdapter;
pub use resolve::resolve;
pub use types::{
BattleSize, Candidate, Diagnostics, GameVersionRef, ParsedRoster, ParsedUnit, ParsedWargear,
ResolvedRef, Roster, RosterLeaderAttachment, RosterPoints, RosterSource, RosterUnit,
RosterWargear, Warning, WarningCode,
};
use crate::data::Dataset;
#[derive(Debug)]
pub enum ImportError {
Decode(DecodeError),
Parse(ParseError),
}
impl std::fmt::Display for ImportError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ImportError::Decode(e) => write!(f, "{e}"),
ImportError::Parse(e) => write!(f, "{e}"),
}
}
}
impl std::error::Error for ImportError {}
impl From<DecodeError> for ImportError {
fn from(e: DecodeError) -> Self {
ImportError::Decode(e)
}
}
impl From<ParseError> for ImportError {
fn from(e: ParseError) -> Self {
ImportError::Parse(e)
}
}
fn adapters() -> Vec<Box<dyn FormatAdapter>> {
vec![Box::new(ListForgeAdapter)]
}
pub fn import_listforge(input: &str, ds: &Dataset) -> Result<Roster, ImportError> {
let decoded = decode_listforge(input)?;
import_roster(&decoded, ds)
}
pub fn import_roster(decoded: &serde_json::Value, ds: &Dataset) -> Result<Roster, ImportError> {
let registry = adapters();
let adapter = select_adapter(decoded, ®istry)?;
let parsed = adapter.parse(decoded)?;
Ok(resolve(&parsed, ds))
}