use std::fmt::Debug;
use std::io::BufRead;
use crate::{Asciicast, Error};
pub mod common;
pub mod v1;
pub mod v2;
pub mod v3;
mod private {
pub trait Sealed {}
impl Sealed for super::V1 {}
impl Sealed for super::V2 {}
impl Sealed for super::V3 {}
}
pub trait Version: private::Sealed + Sized {
const NUMBER: u8;
type Header: Debug + Clone + PartialEq;
type Event: Debug + Clone + PartialEq;
const RELATIVE_TIMING: bool;
fn parse<R: BufRead>(reader: R) -> Result<Asciicast<Self>, Error>;
fn event_time(event: &Self::Event) -> f64;
}
pub trait Streamable: Version {
const SKIP_COMMENTS: bool;
fn header_version(header: &Self::Header) -> u8;
fn parse_event(line: &str) -> Result<Self::Event, Error>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct V1;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct V2;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct V3;
impl Version for V1 {
const NUMBER: u8 = 1;
type Header = v1::Header;
type Event = v1::Frame;
const RELATIVE_TIMING: bool = true;
fn parse<R: BufRead>(reader: R) -> Result<Asciicast<Self>, Error> {
v1::parse(reader)
}
fn event_time(event: &Self::Event) -> f64 {
event.delay
}
}
impl Version for V2 {
const NUMBER: u8 = 2;
type Header = v2::Header;
type Event = v2::Event;
const RELATIVE_TIMING: bool = false;
fn parse<R: BufRead>(reader: R) -> Result<Asciicast<Self>, Error> {
v2::parse(reader)
}
fn event_time(event: &Self::Event) -> f64 {
event.time
}
}
impl Version for V3 {
const NUMBER: u8 = 3;
type Header = v3::Header;
type Event = v3::Event;
const RELATIVE_TIMING: bool = true;
fn parse<R: BufRead>(reader: R) -> Result<Asciicast<Self>, Error> {
v3::parse(reader)
}
fn event_time(event: &Self::Event) -> f64 {
event.interval
}
}