1use std::marker::PhantomData;
2
3use serde::{de::DeserializeOwned, Deserialize, Serialize};
4
5use crate::{
6 context::{HydeContext, ProtectedData},
7 error::{HydeError, Result},
8};
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct Protected<T> {
18 data: ProtectedData,
19 #[serde(skip)]
20 _phantom: PhantomData<T>,
21}
22
23impl<T: Serialize + DeserializeOwned> Protected<T> {
24 pub fn new(ctx: &mut HydeContext, value: &T) -> Result<Self> {
26 let bytes = serde_json::to_vec(value)
27 .map_err(|e| HydeError::Serialization(e.to_string()))?;
28 let data = ctx.protect(&bytes)?;
29 Ok(Self {
30 data,
31 _phantom: PhantomData,
32 })
33 }
34
35 pub fn unprotect(&self, ctx: &mut HydeContext) -> Result<T> {
37 let bytes = ctx.unprotect(&self.data)?;
38 serde_json::from_slice(&bytes)
39 .map_err(|e| HydeError::Serialization(e.to_string()))
40 }
41
42 pub fn protected_data(&self) -> &ProtectedData {
44 &self.data
45 }
46
47 pub fn from_protected_data(data: ProtectedData) -> Self {
49 Self {
50 data,
51 _phantom: PhantomData,
52 }
53 }
54}