pub trait Descriptor {
fn generate_serializer(&self) -> proc_macro2::TokenStream;
fn generate_deserializer(&self) -> proc_macro2::TokenStream;
fn version(&self) -> u16;
fn ty(&self) -> String;
}
pub(crate) struct GenericDescriptor<T> {
pub ty: syn::Ident,
pub version: u16,
pub fields: Vec<T>,
}
pub(crate) trait Exists {
fn exists_at(&self, version: u16) -> bool {
version >= self.start_version()
&& (0 == self.end_version() || (self.end_version() > 0 && version < self.end_version()))
}
fn start_version(&self) -> u16;
fn end_version(&self) -> u16;
}
pub(crate) trait FieldType {
fn ty(&self) -> syn::Type;
}
#[cfg(test)]
mod tests {
use super::Exists;
#[test]
fn test_exists_at() {
impl Exists for u32 {
fn start_version(&self) -> u16 {
3
}
fn end_version(&self) -> u16 {
5
}
}
let test = 1234;
assert!(!test.exists_at(2));
assert!(test.exists_at(3));
assert!(test.exists_at(4));
assert!(!test.exists_at(5));
assert!(!test.exists_at(6));
}
}