brk_vec/structs/
length.rs

1use std::{
2    fs,
3    io::{self, Read},
4    ops::{AddAssign, Deref, DerefMut},
5    path::Path,
6};
7
8use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout};
9
10use crate::{Error, Result};
11
12#[derive(
13    Debug,
14    Default,
15    Clone,
16    Copy,
17    PartialEq,
18    Eq,
19    PartialOrd,
20    Ord,
21    FromBytes,
22    IntoBytes,
23    Immutable,
24    KnownLayout,
25)]
26pub struct Length(usize);
27
28impl Length {
29    pub fn write(&self, path: &Path) -> Result<(), io::Error> {
30        fs::write(path, self.as_bytes())
31    }
32}
33
34impl From<usize> for Length {
35    fn from(value: usize) -> Self {
36        Self(value)
37    }
38}
39
40impl Deref for Length {
41    type Target = usize;
42
43    fn deref(&self) -> &Self::Target {
44        &self.0
45    }
46}
47
48impl DerefMut for Length {
49    fn deref_mut(&mut self) -> &mut Self::Target {
50        &mut self.0
51    }
52}
53
54impl TryFrom<&Path> for Length {
55    type Error = Error;
56    fn try_from(value: &Path) -> Result<Self, Self::Error> {
57        let mut buf = [0; 8];
58        if let Ok(bytes) = fs::read(value) {
59            bytes.as_slice().read_exact(&mut buf)?;
60            Ok(*(Self::ref_from_bytes(&buf)?))
61        } else {
62            Ok(Self::default())
63        }
64    }
65}
66
67impl AddAssign<usize> for Length {
68    fn add_assign(&mut self, rhs: usize) {
69        self.0 += rhs;
70    }
71}