lb_rs/model/
signed_file.rs

1use crate::model::crypto::ECSigned;
2use crate::model::file_like::FileLike;
3use crate::model::file_metadata::FileMetadata;
4use crate::model::tree_like::{TreeLike, TreeLikeMut};
5use std::fmt::{Display, Formatter};
6use uuid::Uuid;
7
8use super::errors::LbResult;
9
10pub type SignedFile = ECSigned<FileMetadata>;
11
12// Impl'd to avoid comparing encrypted
13impl PartialEq for SignedFile {
14    fn eq(&self, other: &Self) -> bool {
15        self.timestamped_value.value == other.timestamped_value.value
16            && self.public_key == other.public_key
17    }
18}
19
20impl Display for SignedFile {
21    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
22        write!(f, "{}", self.display())
23    }
24}
25
26impl<F> TreeLike for Option<F>
27where
28    F: FileLike,
29{
30    type F = F;
31
32    fn ids(&self) -> Vec<Uuid> {
33        match self {
34            Some(f) => vec![*f.id()],
35            None => vec![],
36        }
37    }
38
39    fn maybe_find(&self, id: &Uuid) -> Option<&F> {
40        if let Some(f) = self {
41            if id == f.id() {
42                self.as_ref()
43            } else {
44                None
45            }
46        } else {
47            None
48        }
49    }
50}
51
52impl<F> TreeLikeMut for Option<F>
53where
54    F: FileLike,
55{
56    fn insert(&mut self, f: F) -> LbResult<Option<F>> {
57        Ok(self.replace(f))
58    }
59
60    fn remove(&mut self, id: Uuid) -> LbResult<Option<F>> {
61        if let Some(f) = self {
62            if &id == f.id() {
63                Ok(self.take())
64            } else {
65                Ok(None)
66            }
67        } else {
68            Ok(None)
69        }
70    }
71
72    fn clear(&mut self) -> LbResult<()> {
73        *self = None;
74        Ok(())
75    }
76}