cipherstash-client 0.34.1-alpha.1

The official CipherStash SDK
Documentation
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())
    }

    /// Build a SteVec from a StePlaintextVec with selector length `N`, [PrefixMac], `macca` and a [`DataKeyWithTag`].
    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
    }
}