use crate::Encoding;
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct Position(u32);
impl Position {
pub const ZERO: Self = Self(0);
#[must_use]
pub const fn new(offset: u32) -> Self {
Self(offset)
}
#[must_use]
pub const fn get(self) -> u32 {
self.0
}
}
impl From<u32> for Position {
fn from(offset: u32) -> Self {
Self::new(offset)
}
}
impl From<Position> for u32 {
fn from(position: Position) -> Self {
position.get()
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct FileInfo<'a> {
pub name: &'a [u8],
pub size: Option<Position>,
}
impl<'a> FileInfo<'a> {
#[must_use]
pub const fn new(name: &'a [u8], size: Option<Position>) -> Self {
Self { name, size }
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum WireEncoding {
Binary16,
Hex,
Binary32,
}
impl From<Encoding> for WireEncoding {
fn from(encoding: Encoding) -> Self {
match encoding {
Encoding::ZBIN => Self::Binary16,
Encoding::ZHEX => Self::Hex,
Encoding::ZBIN32 => Self::Binary32,
}
}
}
impl From<WireEncoding> for Encoding {
fn from(encoding: WireEncoding) -> Self {
match encoding {
WireEncoding::Binary16 => Self::ZBIN,
WireEncoding::Hex => Self::ZHEX,
WireEncoding::Binary32 => Self::ZBIN32,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum Input<'a> {
Wire(&'a [u8]),
FileData(&'a [u8]),
StartFile(FileInfo<'a>),
OutgoingAdvanced(usize),
FileAdvanced(usize),
Timeout,
Finish,
Abort,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum Effect<'a> {
WriteWire(&'a [u8]),
ReadFile { offset: Position, max_len: usize },
WriteFile(&'a [u8]),
Event(SessionEvent<'a>),
Idle,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum Progress<'a> {
Consumed(usize),
Effect(Effect<'a>),
Idle,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum SessionEvent<'a> {
SessionStarted,
FileStarted(FileInfo<'a>),
FileCompleted,
SessionCompleted,
Aborted,
}