lockbook_shared/
signed_file.rs

1use crate::crypto::ECSigned;
2use crate::file_like::FileLike;
3use crate::file_metadata::FileMetadata;
4use crate::tree_like::{TreeLike, TreeLikeMut};
5use crate::SharedResult;
6use std::collections::HashSet;
7use std::fmt::{Display, Formatter};
8use uuid::Uuid;
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) -> HashSet<&Uuid> {
33        let mut hashset = HashSet::new();
34        if let Some(f) = self {
35            hashset.insert(f.id());
36        }
37        hashset
38    }
39
40    fn maybe_find(&self, id: &Uuid) -> Option<&F> {
41        if let Some(f) = self {
42            if id == f.id() {
43                self.as_ref()
44            } else {
45                None
46            }
47        } else {
48            None
49        }
50    }
51}
52
53impl<F> TreeLikeMut for Option<F>
54where
55    F: FileLike,
56{
57    fn insert(&mut self, f: F) -> SharedResult<Option<F>> {
58        Ok(self.replace(f))
59    }
60
61    fn remove(&mut self, id: Uuid) -> SharedResult<Option<F>> {
62        if let Some(f) = self {
63            if &id == f.id() {
64                Ok(self.take())
65            } else {
66                Ok(None)
67            }
68        } else {
69            Ok(None)
70        }
71    }
72
73    fn clear(&mut self) -> SharedResult<()> {
74        *self = None;
75        Ok(())
76    }
77}