brk_vec/structs/
length.rs1use 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}