use super::{
face_split, flitter, livesplit, llanfair, llanfair_gered, portal2_live_timer, shit_split,
source_live_timer, speedrun_igt, splits_io, splitterino, splitterz, splitty,
time_split_tracker, urn, wsplit, TimerKind,
};
use crate::{platform::path::Path, Run};
use core::{result::Result as StdResult, str};
#[derive(Debug, snafu::Snafu)]
#[snafu(context(suffix(false)))]
pub enum Error {
NoParserParsedIt,
}
pub type Result<T> = StdResult<T, Error>;
pub struct ParsedRun<'a> {
pub run: Run,
pub kind: TimerKind<'a>,
}
impl ParsedRun<'_> {
pub fn into_owned(self) -> ParsedRun<'static> {
ParsedRun {
run: self.run,
kind: self.kind.into_owned(),
}
}
}
const fn parsed(run: Run, kind: TimerKind<'_>) -> ParsedRun<'_> {
ParsedRun { run, kind }
}
pub fn parse_and_fix<'source>(
source: &'source [u8],
load_files_path: Option<&Path>,
) -> Result<ParsedRun<'source>> {
let mut run = parse(source, load_files_path)?;
run.run.fix_splits();
Ok(run)
}
pub fn parse<'source>(
source: &'source [u8],
load_files_path: Option<&Path>,
) -> Result<ParsedRun<'source>> {
if let Ok(source) = simdutf8::basic::from_utf8(source) {
if let Ok(run) = livesplit::parse(source) {
return Ok(parsed(run, TimerKind::LiveSplit));
}
if let Ok(run) = wsplit::parse(source, load_files_path.is_some()) {
return Ok(parsed(run, TimerKind::WSplit));
}
if let Ok(run) = splitterz::parse(source, load_files_path.is_some()) {
return Ok(parsed(run, TimerKind::SplitterZ));
}
if let Ok(run) = shit_split::parse(source) {
return Ok(parsed(run, TimerKind::ShitSplit));
}
if let Ok(run) = splitty::parse(source) {
return Ok(parsed(run, TimerKind::Splitty));
}
if let Ok(run) = time_split_tracker::parse(source, load_files_path) {
return Ok(parsed(run, TimerKind::TimeSplitTracker));
}
if let Ok(run) = portal2_live_timer::parse(source) {
return Ok(parsed(run, TimerKind::Portal2LiveTimer));
}
if let Ok(run) = face_split::parse(source, load_files_path.is_some()) {
return Ok(parsed(run, TimerKind::FaceSplit));
}
if let Ok(run) = llanfair_gered::parse(source) {
return Ok(parsed(run, TimerKind::LlanfairGered));
}
if let Ok((run, timer)) = splits_io::parse(source) {
return Ok(parsed(run, TimerKind::Generic(timer)));
}
if let Ok(run) = splitterino::parse(source) {
return Ok(parsed(run, TimerKind::Splitterino));
}
if let Ok(run) = flitter::parse(source) {
return Ok(parsed(run, TimerKind::Flitter));
}
if let Ok(run) = source_live_timer::parse(source) {
return Ok(parsed(run, TimerKind::SourceLiveTimer));
}
if let Ok(run) = speedrun_igt::parse(source) {
return Ok(parsed(run, TimerKind::SpeedRunIGT));
}
if let Ok(run) = urn::parse(source) {
return Ok(parsed(run, TimerKind::Urn));
}
}
if let Ok(run) = llanfair::parse(source) {
return Ok(parsed(run, TimerKind::Llanfair));
}
Err(Error::NoParserParsedIt)
}