lb_rs/model/
signed_file.rs1use 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
12impl 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 { if id == f.id() { self.as_ref() } else { None } } else { None }
41 }
42}
43
44impl<F> TreeLikeMut for Option<F>
45where
46 F: FileLike,
47{
48 fn insert(&mut self, f: F) -> LbResult<Option<F>> {
49 Ok(self.replace(f))
50 }
51
52 fn remove(&mut self, id: Uuid) -> LbResult<Option<F>> {
53 if let Some(f) = self {
54 if &id == f.id() { Ok(self.take()) } else { Ok(None) }
55 } else {
56 Ok(None)
57 }
58 }
59
60 fn clear(&mut self) -> LbResult<()> {
61 *self = None;
62 Ok(())
63 }
64}