1use serde::{de::DeserializeOwned, Serialize};
4
5use crate::{Result, ValueBytes, YugenDbError};
6
7pub trait Codec: Send + Sync {
13 fn name(&self) -> &'static str;
15
16 fn serialise_json_value(&self, value: &serde_json::Value) -> Result<ValueBytes>;
18
19 fn deserialise_json_value(&self, bytes: &ValueBytes) -> Result<serde_json::Value>;
21}
22
23pub trait CodecExt: Codec {
25 fn serialise<T>(&self, value: &T) -> Result<ValueBytes>
27 where
28 T: Serialize,
29 {
30 let json_value = serde_json::to_value(value)
31 .map_err(|error| YugenDbError::serialisation_error(error.to_string()))?;
32 self.serialise_json_value(&json_value)
33 }
34
35 fn deserialise<T>(&self, bytes: &ValueBytes) -> Result<T>
37 where
38 T: DeserializeOwned,
39 {
40 let json_value = self.deserialise_json_value(bytes)?;
41 serde_json::from_value(json_value)
42 .map_err(|error| YugenDbError::deserialisation_error(error.to_string()))
43 }
44}
45
46impl<T> CodecExt for T where T: Codec + ?Sized {}
47
48#[derive(Debug, Clone, Copy, Default)]
50pub struct JsonCodec;
51
52impl Codec for JsonCodec {
53 fn name(&self) -> &'static str {
54 "json"
55 }
56
57 fn serialise_json_value(&self, value: &serde_json::Value) -> Result<ValueBytes> {
58 let bytes = serde_json::to_vec(value)
59 .map_err(|error| YugenDbError::serialisation_error(error.to_string()))?;
60 Ok(ValueBytes::from(bytes))
61 }
62
63 fn deserialise_json_value(&self, bytes: &ValueBytes) -> Result<serde_json::Value> {
64 serde_json::from_slice(bytes.as_slice())
65 .map_err(|error| YugenDbError::deserialisation_error(error.to_string()))
66 }
67}