maelstrom_base/
manifest.rs

1use crate::{Sha256Digest, Utf8PathBuf};
2use derive_more::Debug;
3use serde::{Deserialize, Serialize};
4use serde_repr::{Deserialize_repr, Serialize_repr};
5use std::fmt;
6
7#[derive(Debug)]
8#[debug("{_0:o}")]
9struct OctalFmt<T>(T);
10
11#[derive(Clone, Copy, Deserialize, PartialEq, Serialize)]
12pub struct Mode(pub u32);
13
14impl fmt::Debug for Mode {
15    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
16        f.debug_tuple("Mode").field(&OctalFmt(self.0)).finish()
17    }
18}
19
20impl From<Mode> for u32 {
21    fn from(m: Mode) -> u32 {
22        m.0
23    }
24}
25
26#[test]
27fn mode_fmt() {
28    assert_eq!(format!("{:?}", Mode(0o1755)), "Mode(1755)");
29    assert_eq!(format!("{:05?}", Mode(0o1755)), "Mode(01755)");
30}
31
32#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
33pub struct UnixTimestamp(pub i64);
34
35impl UnixTimestamp {
36    pub const EPOCH: Self = Self(0);
37}
38
39impl From<UnixTimestamp> for i64 {
40    fn from(t: UnixTimestamp) -> Self {
41        t.0
42    }
43}
44
45impl From<UnixTimestamp> for std::time::SystemTime {
46    fn from(t: UnixTimestamp) -> Self {
47        if t.0 < 0 {
48            std::time::UNIX_EPOCH - std::time::Duration::from_secs(u64::try_from(-t.0).unwrap())
49        } else {
50            std::time::UNIX_EPOCH + std::time::Duration::from_secs(u64::try_from(t.0).unwrap())
51        }
52    }
53}
54
55#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
56pub struct ManifestEntryMetadata {
57    pub size: u64,
58    pub mode: Mode,
59    pub mtime: UnixTimestamp,
60}
61
62#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
63pub enum ManifestFileData {
64    Digest(Sha256Digest),
65    Inline(Vec<u8>),
66    Empty,
67}
68
69#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
70pub enum ManifestEntryData {
71    Directory { opaque: bool },
72    File(ManifestFileData),
73    Symlink(Vec<u8>),
74    Hardlink(Utf8PathBuf),
75    Whiteout,
76}
77
78#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
79pub struct ManifestEntry {
80    pub path: Utf8PathBuf,
81    pub metadata: ManifestEntryMetadata,
82    pub data: ManifestEntryData,
83}
84
85#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
86#[repr(u32)]
87pub enum ManifestVersion {
88    V0 = 0,
89    #[default]
90    V1 = 1,
91}