#[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)]
#[non_exhaustive]
pub struct FileInfo<'a> {
pub name: &'a [u8],
pub size: Option<Position>,
pub modified: Option<u32>,
pub mode: Option<u32>,
}
impl<'a> FileInfo<'a> {
#[must_use]
pub const fn new(name: &'a [u8], size: Option<Position>) -> Self {
Self {
name,
size,
modified: None,
mode: None,
}
}
#[must_use]
pub const fn with_modified(mut self, modified: u32) -> Self {
self.modified = Some(modified);
self
}
#[must_use]
pub const fn with_mode(mut self, mode: u32) -> Self {
self.mode = Some(mode);
self
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum Action<'a> {
WriteWire(&'a [u8]),
ReadFile { offset: Position, max_len: usize },
WriteFile(&'a [u8]),
Event(Event<'a>),
Idle,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum Event<'a> {
FileStarted(FileInfo<'a>),
FileCompleted,
SessionCompleted,
Aborted,
}