use buffa::Message;
use switchback_traits::{ReferenceManual, Result, SwitchbackCodec, SyncSwitchbackCodec};
use crate::convert;
use crate::pb;
pub const DEFAULT_SWITCHBACK_FILENAME: &str = "switchback.binpb";
#[derive(Debug, Default, Clone, Copy)]
pub struct ProtobufCodec;
impl ProtobufCodec {
pub fn serialize_sync(&self, manual: &ReferenceManual) -> Result<Vec<u8>> {
let proto = convert::to_proto(manual)?;
Ok(proto.encode_to_vec())
}
pub fn deserialize_sync(&self, bytes: &[u8]) -> Result<ReferenceManual> {
let proto = pb::ReferenceManual::decode_from_slice(bytes)
.map_err(|err| switchback_traits::SwitchbackError::codec(err.to_string()))?;
convert::from_proto(proto)
}
}
impl SwitchbackCodec for ProtobufCodec {
async fn serialize(&self, manual: &ReferenceManual) -> Result<Vec<u8>> {
self.serialize_sync(manual)
}
async fn deserialize(&self, bytes: &[u8]) -> Result<ReferenceManual> {
self.deserialize_sync(bytes)
}
}
impl SyncSwitchbackCodec for ProtobufCodec {
fn serialize(&self, manual: &ReferenceManual) -> Result<Vec<u8>> {
self.serialize_sync(manual)
}
fn deserialize(&self, bytes: &[u8]) -> Result<ReferenceManual> {
self.deserialize_sync(bytes)
}
}