use super::ste_plaintext_term::OrderableTerm;
use crate::encryption::{
json_indexer::{
prefix_mac::{PrefixMac, UpdatePrefixMac},
ste_vec::encrypted_term::EncryptedSteVecTerm,
},
EncryptionError,
};
use zerokms_protocol::cipherstash_config::column::SteVecMode;
pub(crate) trait TermBuilder {
fn orderable_term<M>(
term: OrderableTerm,
macca: &mut M,
) -> Result<EncryptedSteVecTerm, EncryptionError>
where
M: PrefixMac + UpdatePrefixMac<&'static str>;
}
pub(crate) trait WithTermBuilder {
type Output;
fn call<TB: TermBuilder>(self) -> Self::Output;
}
pub(crate) fn dispatch_mode<W: WithTermBuilder>(mode: SteVecMode, with: W) -> W::Output {
match mode {
SteVecMode::Compat => with.call::<CompatTermBuilder>(),
SteVecMode::Standard => with.call::<StandardTermBuilder>(),
}
}
pub(crate) struct CompatTermBuilder;
impl TermBuilder for CompatTermBuilder {
fn orderable_term<M>(
term: OrderableTerm,
macca: &mut M,
) -> Result<EncryptedSteVecTerm, EncryptionError>
where
M: PrefixMac + UpdatePrefixMac<&'static str>,
{
term.build_compat(macca)
}
}
pub(crate) struct StandardTermBuilder;
impl TermBuilder for StandardTermBuilder {
fn orderable_term<M>(
term: OrderableTerm,
macca: &mut M,
) -> Result<EncryptedSteVecTerm, EncryptionError>
where
M: PrefixMac + UpdatePrefixMac<&'static str>,
{
term.build_standard(macca)
}
}