1use std::future::Future;
18use std::path::PathBuf;
19use std::pin::Pin;
20use std::time::Duration;
21use super::EvidenceError;
25
26pub(crate) type Answering<'a, T> = Pin<Box<dyn Future<Output = Result<T, EvidenceError>> + Send + 'a>>;
33
34#[derive(Clone, Debug, PartialEq, Eq)]
37pub struct Excerpt {
38 pub requested: u64,
39 pub offset: u64,
40 pub bytes: Vec<u8>,
41 pub length: u64,
42}
43
44pub trait Vault: Send + Sync + 'static {
49 fn ceiling(&self) -> usize;
50
51 fn cadence(&self) -> Duration;
52
53 fn open(&self, name: &str) -> impl Future<Output = Result<u64, EvidenceError>> + Send;
54
55 fn external(&self, name: &str) -> impl Future<Output = Result<Option<PathBuf>, EvidenceError>> + Send;
56
57 fn append(&self, name: &str, bytes: &[u8]) -> impl Future<Output = Result<u64, EvidenceError>> + Send;
58
59 fn length(&self, name: &str) -> impl Future<Output = Result<u64, EvidenceError>> + Send;
60
61 fn verify(&self, name: &str) -> impl Future<Output = Result<(u64, u64), EvidenceError>> + Send;
62
63 fn claim(&self, name: &str) -> impl Future<Output = Result<(), EvidenceError>> + Send;
64
65 fn quarantine(&self, name: &str) -> impl Future<Output = Result<(), EvidenceError>> + Send;
66
67 fn read(&self, name: &str, offset: u64, limit: usize) -> impl Future<Output = Result<(Vec<u8>, u64), EvidenceError>> + Send;
68
69 fn read_draft(&self, name: &str, offset: u64, limit: usize) -> impl Future<Output = Result<(Vec<u8>, u64), EvidenceError>> + Send;
70}
71
72pub(crate) trait Keeping: Send + Sync + 'static {
73 fn ceiling(&self) -> usize;
74
75 fn cadence(&self) -> Duration;
76
77 fn open<'a>(&'a self, name: &'a str) -> Answering<'a, u64>;
78
79 fn external<'a>(&'a self, name: &'a str) -> Answering<'a, Option<PathBuf>>;
80
81 fn append<'a>(&'a self, name: &'a str, bytes: &'a [u8]) -> Answering<'a, u64>;
82
83 fn length<'a>(&'a self, name: &'a str) -> Answering<'a, u64>;
84
85 fn verify<'a>(&'a self, name: &'a str) -> Answering<'a, (u64, u64)>;
86
87 fn claim<'a>(&'a self, name: &'a str) -> Answering<'a, ()>;
88
89 fn quarantine<'a>(&'a self, name: &'a str) -> Answering<'a, ()>;
90
91 fn read<'a>(&'a self, name: &'a str, offset: u64, limit: usize) -> Answering<'a, (Vec<u8>, u64)>;
92
93 fn read_draft<'a>(&'a self, name: &'a str, offset: u64, limit: usize) -> Answering<'a, (Vec<u8>, u64)>;
94}
95
96impl Excerpt {
99 pub fn next(&self) -> u64 {
100 self.offset + self.bytes.len() as u64
101 }
102}
103
104impl<V: Vault> Keeping for V {
105 fn ceiling(&self) -> usize {
106 Vault::ceiling(self)
107 }
108
109 fn cadence(&self) -> Duration {
110 Vault::cadence(self)
111 }
112
113 fn open<'a>(&'a self, name: &'a str) -> Answering<'a, u64> {
114 Box::pin(Vault::open(self, name))
115 }
116
117 fn external<'a>(&'a self, name: &'a str) -> Answering<'a, Option<PathBuf>> {
118 Box::pin(Vault::external(self, name))
119 }
120
121 fn append<'a>(&'a self, name: &'a str, bytes: &'a [u8]) -> Answering<'a, u64> {
122 Box::pin(Vault::append(self, name, bytes))
123 }
124
125 fn length<'a>(&'a self, name: &'a str) -> Answering<'a, u64> {
126 Box::pin(Vault::length(self, name))
127 }
128
129 fn verify<'a>(&'a self, name: &'a str) -> Answering<'a, (u64, u64)> {
130 Box::pin(Vault::verify(self, name))
131 }
132
133 fn claim<'a>(&'a self, name: &'a str) -> Answering<'a, ()> {
134 Box::pin(Vault::claim(self, name))
135 }
136
137 fn quarantine<'a>(&'a self, name: &'a str) -> Answering<'a, ()> {
138 Box::pin(Vault::quarantine(self, name))
139 }
140
141 fn read<'a>(&'a self, name: &'a str, offset: u64, limit: usize) -> Answering<'a, (Vec<u8>, u64)> {
142 Box::pin(Vault::read(self, name, offset, limit))
143 }
144
145 fn read_draft<'a>(&'a self, name: &'a str, offset: u64, limit: usize) -> Answering<'a, (Vec<u8>, u64)> {
146 Box::pin(Vault::read_draft(self, name, offset, limit))
147 }
148}
149
150