pub mod immut;
pub mod mode;
pub mod r#mut;
pub(crate) mod tstamp;
use nuts_backend::Backend;
use nuts_bytes::{FromBytes, ToBytes, Writer};
use crate::entry::mode::Mode;
use crate::entry::tstamp::Timestamps;
use crate::error::ArchiveResult;
use crate::id::Id;
use crate::pager::Pager;
#[cfg(test)]
const HALF: u8 = 53;
#[cfg(test)]
const FULL: u8 = 106;
#[derive(Debug, FromBytes, ToBytes)]
struct Inner {
name: String,
mode: Mode,
tstamps: Timestamps,
size: u64,
}
impl Inner {
fn new(name: String, mode: Mode) -> Inner {
Inner {
name,
mode,
tstamps: Timestamps::new(),
size: 0,
}
}
fn load<B: Backend>(pager: &mut Pager<B>, id: &Id<B>) -> ArchiveResult<Inner, B> {
let mut reader = pager.read_buf(id)?;
let inner = reader.read()?;
Ok(inner)
}
fn flush<B: Backend>(&self, pager: &mut Pager<B>, id: &Id<B>) -> ArchiveResult<(), B> {
let buf = {
let mut writer = Writer::new(vec![]);
writer.write(self)?;
writer.into_target()
};
pager.write(id, &buf)?;
Ok(())
}
}
macro_rules! populate_mode_api {
() => {
pub fn can_read(&self, group: crate::Group) -> bool {
self.inner().mode.can_read(group)
}
pub fn can_write(&self, group: crate::Group) -> bool {
self.inner().mode.can_write(group)
}
pub fn can_execute(&self, group: crate::Group) -> bool {
self.inner().mode.can_execute(group)
}
};
(mut) => {
pub fn set_readable(&mut self, group: crate::Group, readable: bool) {
self.inner_mut().mode.set_readable(group, readable)
}
pub fn set_writable(&mut self, group: crate::Group, writable: bool) {
self.inner_mut().mode.set_writable(group, writable)
}
pub fn set_executable(&mut self, group: crate::Group, executable: bool) {
self.inner_mut().mode.set_executable(group, executable)
}
};
}
macro_rules! populate_tstamp_api {
() => {
pub fn appended(&self) -> &chrono::DateTime<chrono::Utc> {
self.inner().tstamps.appended()
}
pub fn created(&self) -> &chrono::DateTime<chrono::Utc> {
self.inner().tstamps.created()
}
pub fn changed(&self) -> &chrono::DateTime<chrono::Utc> {
self.inner().tstamps.changed()
}
pub fn modified(&self) -> &chrono::DateTime<chrono::Utc> {
self.inner().tstamps.modified()
}
};
(mut) => {
populate_tstamp_api!();
pub fn set_created(&mut self, created: chrono::DateTime<chrono::Utc>) {
self.inner_mut().tstamps.set_created(created)
}
pub fn set_changed(&mut self, changed: chrono::DateTime<chrono::Utc>) {
self.inner_mut().tstamps.set_changed(changed)
}
pub fn set_modified(&mut self, modified: chrono::DateTime<chrono::Utc>) {
self.inner_mut().tstamps.set_modified(modified)
}
};
}
use {populate_mode_api, populate_tstamp_api};