use crate::contract::EncodedSizes;
mod sealed {
pub trait Sealed {}
}
pub trait Encoding: sealed::Sealed + 'static {
const NAME: &'static str;
fn max_size(sizes: &EncodedSizes) -> Option<u32>;
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct FlatBuffers;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Proto3;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ReprC;
impl sealed::Sealed for FlatBuffers {}
impl sealed::Sealed for Proto3 {}
impl sealed::Sealed for ReprC {}
impl Encoding for FlatBuffers {
const NAME: &'static str = "flatbuffers";
fn max_size(sizes: &EncodedSizes) -> Option<u32> {
sizes.flatbuffers
}
}
impl Encoding for Proto3 {
const NAME: &'static str = "proto3";
fn max_size(sizes: &EncodedSizes) -> Option<u32> {
sizes.proto3
}
}
impl Encoding for ReprC {
const NAME: &'static str = "repr-c";
fn max_size(sizes: &EncodedSizes) -> Option<u32> {
sizes.repr_c
}
}
#[cfg(test)]
mod tests {
use super::{sealed, Encoding, FlatBuffers, Proto3, ReprC};
use crate::contract::EncodedSizes;
struct Fourth;
impl sealed::Sealed for Fourth {}
impl Encoding for Fourth {
const NAME: &'static str = "fourth";
fn max_size(_: &EncodedSizes) -> Option<u32> {
None
}
}
const SIZES: EncodedSizes = EncodedSizes {
proto3: Some(1),
flatbuffers: Some(2),
repr_c: Some(3),
};
#[test]
fn name_and_max_size_are_the_only_required_items() {
assert_eq!(Fourth::NAME, "fourth");
assert_eq!(Fourth::max_size(&SIZES), None);
}
#[test]
fn each_encoding_reads_its_own_size_field() {
assert_eq!(Proto3::max_size(&SIZES), Some(1));
assert_eq!(FlatBuffers::max_size(&SIZES), Some(2));
assert_eq!(ReprC::max_size(&SIZES), Some(3));
}
#[test]
fn each_name_is_the_cargo_feature_name() {
assert_eq!(FlatBuffers::NAME, "flatbuffers");
assert_eq!(Proto3::NAME, "proto3");
assert_eq!(ReprC::NAME, "repr-c");
}
}