#[cfg(test)]
mod tests;
use chrono::{DateTime, Utc};
use nuts_backend::Backend;
use nuts_bytes::{FromBytes, ToBytes};
use thiserror::Error;
use crate::magic::{validate_magic, Magic, MagicErrorFactory, MAGIC};
use crate::{datetime, ArchiveResult, Error};
const CURRENT_REVISION: u16 = 2;
const UNSUPPORTED_REVISIONS: [(u16, &str); 1] = [(1, "0.4.3")];
#[derive(Debug, Error)]
#[error("invalid header")]
pub struct HeaderMagicError;
impl MagicErrorFactory for HeaderMagicError {
fn create() -> Self {
HeaderMagicError
}
}
#[derive(Debug, FromBytes, ToBytes)]
pub struct Header {
#[nuts_bytes(map_from_bytes = validate_magic::<HeaderMagicError>)]
magic: Magic,
revision: u16,
#[nuts_bytes(map = datetime)]
pub created: DateTime<Utc>,
#[nuts_bytes(map = datetime)]
pub modified: DateTime<Utc>,
pub nfiles: u64,
}
impl Header {
pub fn create() -> Header {
let now = Utc::now();
Header {
magic: MAGIC,
revision: CURRENT_REVISION,
created: now,
modified: now,
nfiles: 0,
}
}
pub fn validate_revision<B: Backend>(&self) -> ArchiveResult<(), B> {
for (rev, version) in UNSUPPORTED_REVISIONS {
if self.revision == rev {
return Err(Error::UnsupportedRevision(rev, version.to_string()));
}
}
Ok(())
}
pub fn inc_files(&mut self) {
self.nfiles += 1;
self.modified = Utc::now();
}
}