Skip to main content

harmos_runtime/evidence/
vault.rs

1/* ***
2 *
3 * Harmos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * ***
8 */
9
10/* === Modules === */
11
12/* === Re-Exports === */
13
14/* === Imports === */
15
16// Standard Library Imports
17use std::future::Future;
18use std::path::PathBuf;
19use std::pin::Pin;
20use std::time::Duration;
21// Third Party Imports
22
23// Local Imports
24use super::EvidenceError;
25
26/* === Constants === */
27
28/* === Macros === */
29
30/* === Type Aliases === */
31
32pub(crate) type Answering<'a, T> = Pin<Box<dyn Future<Output = Result<T, EvidenceError>> + Send + 'a>>;
33
34/* === Structs === */
35
36#[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
44/* === Enums === */
45
46/* === Traits === */
47
48pub 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
96/* === Implementations === */
97
98impl 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/* === Public Functions === */
151
152/* === Private Functions === */
153
154/* === Tests === */