use super::priv_state::PlaintextEntry;
use super::SteVecPendingEncryption;
use crate::encryption::{
json_indexer::{
path_values::{PathSegment, PathValue},
prefix_mac::{PrefixMac, UpdatePrefixMac},
},
EncryptionError,
};
use itertools::Itertools;
#[cfg_attr(test, derive(Debug))]
pub struct StePlaintextVec<'p>(Vec<PlaintextEntry<'p>>);
impl<'p> StePlaintextVec<'p> {
pub fn new() -> Self {
Self(Vec::new())
}
pub fn index<const N: usize, M>(
self,
macca: &mut M,
) -> Result<SteVecPendingEncryption<N>, EncryptionError>
where
for<'u> M: PrefixMac
+ UpdatePrefixMac<PathSegment<'p>>
+ UpdatePrefixMac<[u8; N]>
+ UpdatePrefixMac<&'u str>
+ UpdatePrefixMac<String>,
{
let indexed = self
.0
.into_iter()
.map(|entry| entry.build_selector::<N, M>(macca).build_term(macca))
.try_collect()?;
Ok(SteVecPendingEncryption(indexed))
}
fn push(&mut self, PathValue(path, value): PathValue<'p>) {
self.0.push(PlaintextEntry::new(path, value));
}
}
impl<'p> FromIterator<PathValue<'p>> for StePlaintextVec<'p> {
fn from_iter<I: IntoIterator<Item = PathValue<'p>>>(iter: I) -> Self {
let mut ste_vec = StePlaintextVec::new();
for entry in iter {
ste_vec.push(entry);
}
ste_vec
}
}