use dyn_encoding::{CodecRegistry, ProtobufCodec};
use crate::proto::pb::messages::{
RpbDelReq, RpbErrorResp, RpbGetBucketReq, RpbGetBucketResp, RpbGetReq, RpbGetResp,
RpbGetServerInfoResp, RpbIndexReq, RpbIndexResp, RpbListBucketsReq, RpbListBucketsResp,
RpbListKeysReq, RpbListKeysResp, RpbPingReq, RpbPingResp, RpbPutReq, RpbPutResp,
RpbServerInfoReq, RpbSetBucketReq, RpbSetBucketResp,
};
pub const PBC_CONTENT_TYPE: &str = "application/x-protobuf";
pub struct PbCodecBundle {
pub registry: CodecRegistry,
}
impl PbCodecBundle {
#[must_use]
pub fn registry(&self) -> &CodecRegistry {
&self.registry
}
}
#[must_use]
pub fn codec_registry() -> PbCodecBundle {
let mut codec = ProtobufCodec::new();
codec
.register::<RpbErrorResp>()
.register::<RpbPingReq>()
.register::<RpbPingResp>()
.register::<RpbGetReq>()
.register::<RpbGetResp>()
.register::<RpbPutReq>()
.register::<RpbPutResp>()
.register::<RpbDelReq>()
.register::<RpbServerInfoReq>()
.register::<RpbGetServerInfoResp>()
.register::<RpbListBucketsReq>()
.register::<RpbListBucketsResp>()
.register::<RpbListKeysReq>()
.register::<RpbListKeysResp>()
.register::<RpbGetBucketReq>()
.register::<RpbGetBucketResp>()
.register::<RpbSetBucketReq>()
.register::<RpbSetBucketResp>()
.register::<RpbIndexReq>()
.register::<RpbIndexResp>();
let mut registry = CodecRegistry::new();
registry.register(codec);
PbCodecBundle { registry }
}
#[cfg(test)]
mod tests {
use super::*;
use crate::proto::pb::messages::RpbGetReq;
use dyn_encoding::WireValue;
#[test]
fn registry_has_protobuf_codec() {
let bundle = codec_registry();
let codec = bundle
.registry()
.for_content_type(PBC_CONTENT_TYPE)
.expect("protobuf codec installed");
assert_eq!(codec.content_type(), PBC_CONTENT_TYPE);
}
#[test]
fn registry_round_trips_get_request() {
let bundle = codec_registry();
let codec = bundle
.registry()
.for_content_type(PBC_CONTENT_TYPE)
.expect("codec");
let req = RpbGetReq {
bucket: b"b".to_vec(),
key: b"k".to_vec(),
..RpbGetReq::default()
};
let bytes = codec.encode(&req).expect("encode");
let back = codec
.decode(RpbGetReq::wire_type_id(), &bytes)
.expect("decode");
let back = back.as_any().downcast_ref::<RpbGetReq>().expect("downcast");
assert_eq!(back, &req);
}
}