use std::marker::PhantomData;
use serde::{de::DeserializeOwned, Deserialize, Serialize};
use crate::{
context::{ProtectedData, VeilContext},
error::{Result, VeilError},
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Protected<T> {
data: ProtectedData,
#[serde(skip)]
_phantom: PhantomData<T>,
}
impl<T: Serialize + DeserializeOwned> Protected<T> {
pub fn new(ctx: &mut VeilContext, value: &T) -> Result<Self> {
let bytes = serde_json::to_vec(value)
.map_err(|e| VeilError::Serialization(e.to_string()))?;
let data = ctx.protect(&bytes)?;
Ok(Self {
data,
_phantom: PhantomData,
})
}
pub fn unprotect(&self, ctx: &mut VeilContext) -> Result<T> {
let bytes = ctx.unprotect(&self.data)?;
serde_json::from_slice(&bytes)
.map_err(|e| VeilError::Serialization(e.to_string()))
}
pub fn protected_data(&self) -> &ProtectedData {
&self.data
}
pub fn from_protected_data(data: ProtectedData) -> Self {
Self {
data,
_phantom: PhantomData,
}
}
}