diff --git a/search-index.js b/search-index.js
index 162ca08..a068f17 100644
--- a/search-index.js
+++ b/search-index.js
@@ -1,5 +1,5 @@
var searchIndex = new Map(JSON.parse('[\
-["versioned_binary_serialization",{"doc":"","t":"EECCCCKTTMMMMNFTTTFKFNNNNNNMNNMNNNNNNNNMNNMNNNNNNNNNNNNTTFFNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNTTTTK","n":["BinarySerializer","Serializer","binary_serializer","bincode_serializer","version","versioned","BinarySerializer","MAJOR","MINOR","deserialize","deserialize_no_version","serialize","serialize_no_version","version","BincodeSerializer","MAJOR","MINOR","VERSION_MISMATCH","VersionChecker","VersionedBinarySerializer","VersionedBincodeSerializer","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","deserialize","deserialize","deserialize","deserialize_no_version","deserialize_no_version","deserialize_no_version","from","from","from","into","into","into","serialize","serialize","serialize","serialize_no_version","serialize_no_version","serialize_no_version","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","version","MAJOR","MINOR","StaticVersion","Version","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","deserialize","deserialize","eq","fmt","fmt","fmt","from","from","hash","into","into","major","minor","serialize","serialize","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","MAX_MAJOR","MAX_MINOR","MIN_MAJOR","MIN_MINOR","Versioned"],"q":[[0,"versioned_binary_serialization"],[6,"versioned_binary_serialization::binary_serializer"],[14,"versioned_binary_serialization::bincode_serializer"],[55,"versioned_binary_serialization::version"],[91,"versioned_binary_serialization::versioned"],[96,"anyhow"],[97,"serde::de"],[98,"alloc::vec"],[99,"serde::ser"],[100,"core::marker"],[101,"core::result"],[102,"core::any"],[103,"anyhow"],[104,"core::fmt"],[105,"serde::ser"]],"d":["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self)
.","Calls U::from(self)
.","Calls U::from(self)
.","","","","","","","","","","","","","","","","","","","","Type for protocol version number","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self)
.","Calls U::from(self)
.","major version number","minor version number","","","","","","","","","","","","","","","",""],"i":[0,0,0,0,0,0,0,22,22,22,22,22,22,22,0,23,23,24,0,0,0,25,24,26,25,24,26,23,25,26,23,25,26,25,24,26,25,24,26,23,25,26,23,25,26,25,24,26,25,24,26,25,24,26,23,12,12,0,0,8,12,8,12,8,12,8,12,8,8,8,8,8,12,8,12,8,8,12,8,8,8,8,8,12,8,8,12,8,12,8,12,9,9,9,9,0],"f":[0,0,0,0,0,0,0,0,0,[[[2,[1]]],[[3,[-1]]],4],[[[2,[1]]],[[3,[-1]]],4],[-1,[[3,[[5,[1]]]]],[6,7]],[-1,[[3,[[5,[1]]]]],[6,7]],[[],8],0,0,0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[2,[1]]],[[3,[-1]]],[4,9]],[[[2,[1]]],[[3,[-1]]],4],[[[2,[1]]],[[3,[-1]]],[4,9]],[[[2,[1]]],[[3,[-1]]],[4,9]],[[[2,[1]]],[[3,[-1]]],4],[[[2,[1]]],[[3,[-1]]],[4,9]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,[[3,[[5,[1]]]]],[6,9,7]],[-1,[[3,[[5,[1]]]]],[6,7]],[-1,[[3,[[5,[1]]]]],[6,9,7]],[-1,[[3,[[5,[1]]]]],[6,9,7]],[-1,[[3,[[5,[1]]]]],[6,7]],[-1,[[3,[[5,[1]]]]],[6,9,7]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,11,[]],[-1,11,[]],[-1,11,[]],[[],8],0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[8,8],[12,12],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[[2,[1]]],[[10,[[13,[8,[2,[1]]]],14]]]],[-1,[[10,[8]]],15],[[8,8],16],[[8,17],18],[[8,17],18],[[12,17],18],[-1,-1,[]],[-1,-1,[]],[[8,-1],13,19],[-1,-2,[],[]],[-1,-2,[],[]],0,0,[[8,-1],10,20],[8,[[5,[1]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,21,[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,11,[]],[-1,11,[]],0,0,0,0,0],"c":[],"p":[[1,"u8"],[1,"slice"],[8,"Result",96],[10,"Deserialize",97],[5,"Vec",98],[10,"Serialize",99],[10,"Sized",100],[5,"Version",55],[10,"Versioned",91],[6,"Result",101],[5,"TypeId",102],[5,"StaticVersion",55],[1,"tuple"],[5,"Error",96],[10,"Deserializer",97],[1,"bool"],[5,"Formatter",103],[8,"Result",103],[10,"Hasher",104],[10,"Serializer",99],[5,"String",105],[10,"BinarySerializer",6],[10,"VersionedBinarySerializer",14],[5,"VersionChecker",14],[5,"BincodeSerializer",14],[5,"VersionedBincodeSerializer",14]],"b":[[67,"impl-Version"],[68,"impl-Deserialize%3C\'de%3E-for-Version"],[70,"impl-Debug-for-Version"],[71,"impl-Display-for-Version"],[80,"impl-Serialize-for-Version"],[81,"impl-Version"]]}]\
+["versioned_binary_serialization",{"doc":"","t":"EECCCCKTTMMMMNFTTRTFKFNNNNNNMNNMNNNNNNNNMNNMNNNNNNNNNNNNTTFKFNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNTTTTK","n":["BinarySerializer","Serializer","binary_serializer","bincode_serializer","version","versioned","BinarySerializer","MAJOR","MINOR","deserialize","deserialize_no_version","serialize","serialize_no_version","version","BincodeSerializer","MAJOR","MINOR","StaticVersion","VERSION_MISMATCH","VersionChecker","VersionedBinarySerializer","VersionedBincodeSerializer","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","deserialize","deserialize","deserialize","deserialize_no_version","deserialize_no_version","deserialize_no_version","from","from","from","into","into","into","serialize","serialize","serialize","serialize_no_version","serialize_no_version","serialize_no_version","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","version","MAJOR","MINOR","StaticVersion","StaticVersionType","Version","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","deserialize","deserialize","eq","fmt","fmt","fmt","from","from","hash","into","into","major","minor","serialize","serialize","to_owned","to_owned","to_string","try_from","try_from","try_into","try_into","type_id","type_id","version","version","MAX_MAJOR","MAX_MINOR","MIN_MAJOR","MIN_MINOR","Versioned"],"q":[[0,"versioned_binary_serialization"],[6,"versioned_binary_serialization::binary_serializer"],[14,"versioned_binary_serialization::bincode_serializer"],[56,"versioned_binary_serialization::version"],[95,"versioned_binary_serialization::versioned"],[100,"anyhow"],[101,"serde::de"],[102,"alloc::vec"],[103,"serde::ser"],[104,"core::marker"],[105,"core::result"],[106,"core::any"],[107,"anyhow"],[108,"core::fmt"],[109,"serde::ser"]],"d":["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self)
.","Calls U::from(self)
.","Calls U::from(self)
.","","","","","","","","","","","","","","","","","","","","","Type for protocol version number","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self)
.","Calls U::from(self)
.","major version number","minor version number","","","","","","","","","","","","","","","","","",""],"i":[0,0,0,0,0,0,0,22,22,22,22,22,22,22,0,23,23,23,24,0,0,0,25,24,26,25,24,26,23,25,26,23,25,26,25,24,26,25,24,26,23,25,26,23,25,26,25,24,26,25,24,26,25,24,26,23,27,27,0,0,0,8,12,8,12,8,12,8,12,8,8,8,8,8,12,8,12,8,8,12,8,8,8,8,8,12,8,8,12,8,12,8,12,27,12,9,9,9,9,0],"f":[0,0,0,0,0,0,0,0,0,[[[2,[1]]],[[3,[-1]]],4],[[[2,[1]]],[[3,[-1]]],4],[-1,[[3,[[5,[1]]]]],[6,7]],[-1,[[3,[[5,[1]]]]],[6,7]],[[],8],0,0,0,0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[[[2,[1]]],[[3,[-1]]],[4,9]],[[[2,[1]]],[[3,[-1]]],4],[[[2,[1]]],[[3,[-1]]],[4,9]],[[[2,[1]]],[[3,[-1]]],[4,9]],[[[2,[1]]],[[3,[-1]]],4],[[[2,[1]]],[[3,[-1]]],[4,9]],[-1,-1,[]],[-1,-1,[]],[-1,-1,[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,[[3,[[5,[1]]]]],[6,9,7]],[-1,[[3,[[5,[1]]]]],[6,7]],[-1,[[3,[[5,[1]]]]],[6,9,7]],[-1,[[3,[[5,[1]]]]],[6,9,7]],[-1,[[3,[[5,[1]]]]],[6,7]],[-1,[[3,[[5,[1]]]]],[6,9,7]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,11,[]],[-1,11,[]],[-1,11,[]],[[],8],0,0,0,0,0,[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,-2,[],[]],[8,8],[12,12],[[-1,-2],13,[],[]],[[-1,-2],13,[],[]],[[[2,[1]]],[[10,[[13,[8,[2,[1]]]],14]]]],[-1,[[10,[8]]],15],[[8,8],16],[[8,17],18],[[8,17],18],[[12,17],18],[-1,-1,[]],[-1,-1,[]],[[8,-1],13,19],[-1,-2,[],[]],[-1,-2,[],[]],0,0,[[8,-1],10,20],[8,[[5,[1]]]],[-1,-2,[],[]],[-1,-2,[],[]],[-1,21,[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,[[10,[-2]]],[],[]],[-1,11,[]],[-1,11,[]],[[],8],[[],8],0,0,0,0,0],"c":[],"p":[[1,"u8"],[1,"slice"],[8,"Result",100],[10,"Deserialize",101],[5,"Vec",102],[10,"Serialize",103],[10,"Sized",104],[5,"Version",56],[10,"Versioned",95],[6,"Result",105],[5,"TypeId",106],[5,"StaticVersion",56],[1,"tuple"],[5,"Error",100],[10,"Deserializer",101],[1,"bool"],[5,"Formatter",107],[8,"Result",107],[10,"Hasher",108],[10,"Serializer",103],[5,"String",109],[10,"BinarySerializer",6],[10,"VersionedBinarySerializer",14],[5,"VersionChecker",14],[5,"BincodeSerializer",14],[5,"VersionedBincodeSerializer",14],[10,"StaticVersionType",56]],"b":[[69,"impl-Version"],[70,"impl-Deserialize%3C\'de%3E-for-Version"],[72,"impl-Display-for-Version"],[73,"impl-Debug-for-Version"],[82,"impl-Serialize-for-Version"],[83,"impl-Version"]]}]\
]'));
if (typeof exports !== 'undefined') exports.searchIndex = searchIndex;
else if (window.initSearch) window.initSearch(searchIndex);
diff --git a/src/versioned_binary_serialization/bincode_serializer.rs.html b/src/versioned_binary_serialization/bincode_serializer.rs.html
index f27d1a7..fa192af 100644
--- a/src/versioned_binary_serialization/bincode_serializer.rs.html
+++ b/src/versioned_binary_serialization/bincode_serializer.rs.html
@@ -268,18 +268,21 @@
267
268
269
-
use std::io::Write;
-
-use crate::{binary_serializer::BinarySerializer, version::Version, versioned::Versioned};
+270
+
use std::{io::Write, marker::PhantomData};
+
+use crate::{
+ binary_serializer::BinarySerializer,
+ version::{StaticVersionType, Version},
+ versioned::Versioned,
+};
use anyhow::{anyhow, Result};
use serde::{Deserialize, Serialize};
-pub struct BincodeSerializer<const VER_MAJOR: u16, const VER_MINOR: u16>;
-impl<const VER_MAJOR: u16, const VER_MINOR: u16> BinarySerializer
- for BincodeSerializer<VER_MAJOR, VER_MINOR>
-{
- const MAJOR: u16 = VER_MAJOR;
- const MINOR: u16 = VER_MINOR;
+pub struct BincodeSerializer<VER: StaticVersionType>(PhantomData<VER>);
+impl<VER: StaticVersionType> BinarySerializer for BincodeSerializer<VER> {
+ const MAJOR: u16 = VER::MAJOR;
+ const MINOR: u16 = VER::MINOR;
fn serialize_no_version<T: ?Sized>(value: &T) -> Result<Vec<u8>>
where
T: Serialize,
@@ -308,7 +311,7 @@
T: Deserialize<'a>,
{
let (ver, rest) = Version::deserialize(bytes)?;
- if ver.major != VER_MAJOR || ver.minor != VER_MINOR {
+ if ver.major != VER::MAJOR || ver.minor != VER::MINOR {
return Err(anyhow!(
"Version Mismatch! Expected {}, got {}",
ver,
@@ -320,16 +323,15 @@
}
// Testing; will use to replace BincodeSerializer after applying `Versioned` to existing serialized types
-pub struct VersionChecker<const VER_MAJOR: u16, const VER_MINOR: u16, TYPE: ?Sized + Versioned> {
- _phantom: std::marker::PhantomData<TYPE>,
+pub struct VersionChecker<VER: StaticVersionType, TYPE: ?Sized + Versioned> {
+ _phantom_ver: std::marker::PhantomData<VER>,
+ _phantom_type: std::marker::PhantomData<TYPE>,
}
-impl<const VER_MAJOR: u16, const VER_MINOR: u16, TYPE: ?Sized + Versioned>
- VersionChecker<VER_MAJOR, VER_MINOR, TYPE>
-{
- pub const VERSION_MISMATCH: () = if VER_MAJOR < TYPE::MIN_MAJOR
- || VER_MAJOR > TYPE::MAX_MAJOR
- || (VER_MAJOR == TYPE::MIN_MAJOR && VER_MINOR < TYPE::MIN_MINOR)
- || (VER_MAJOR == TYPE::MAX_MAJOR && VER_MINOR > TYPE::MAX_MINOR)
+impl<VER: StaticVersionType, TYPE: ?Sized + Versioned> VersionChecker<VER, TYPE> {
+ pub const VERSION_MISMATCH: () = if VER::MAJOR < TYPE::MIN_MAJOR
+ || VER::MAJOR > TYPE::MAX_MAJOR
+ || (VER::MAJOR == TYPE::MIN_MAJOR && VER::MINOR < TYPE::MIN_MINOR)
+ || (VER::MAJOR == TYPE::MAX_MAJOR && VER::MINOR > TYPE::MAX_MINOR)
{
panic!("unsupported type for version")
};
@@ -338,6 +340,7 @@
pub trait VersionedBinarySerializer {
const MAJOR: u16;
const MINOR: u16;
+ type StaticVersion: StaticVersionType;
fn version() -> Version {
Version {
@@ -365,19 +368,18 @@
T: Deserialize<'a> + Versioned;
}
-pub struct VersionedBincodeSerializer<const VER_MAJOR: u16, const VER_MINOR: u16>;
-impl<const VER_MAJOR: u16, const VER_MINOR: u16> VersionedBinarySerializer
- for VersionedBincodeSerializer<VER_MAJOR, VER_MINOR>
-{
- const MAJOR: u16 = VER_MAJOR;
- const MINOR: u16 = VER_MINOR;
+pub struct VersionedBincodeSerializer<VER: StaticVersionType>(PhantomData<VER>);
+impl<VER: StaticVersionType> VersionedBinarySerializer for VersionedBincodeSerializer<VER> {
+ const MAJOR: u16 = VER::MAJOR;
+ const MINOR: u16 = VER::MINOR;
+ type StaticVersion = VER;
fn serialize_no_version<T: ?Sized>(value: &T) -> Result<Vec<u8>>
where
T: Serialize + Versioned,
{
#[allow(clippy::let_unit_value)]
- let _ = VersionChecker::<VER_MAJOR, VER_MINOR, T>::VERSION_MISMATCH;
+ let _ = VersionChecker::<VER, T>::VERSION_MISMATCH;
Ok(bincode::serialize(value)?)
}
@@ -387,7 +389,7 @@
T: Deserialize<'a> + Versioned,
{
#[allow(clippy::let_unit_value)]
- let _ = VersionChecker::<VER_MAJOR, VER_MINOR, T>::VERSION_MISMATCH;
+ let _ = VersionChecker::<VER, T>::VERSION_MISMATCH;
Ok(bincode::deserialize(bytes)?)
}
@@ -397,7 +399,7 @@
T: Serialize + Versioned,
{
#[allow(clippy::let_unit_value)]
- let _ = VersionChecker::<VER_MAJOR, VER_MINOR, T>::VERSION_MISMATCH;
+ let _ = VersionChecker::<VER, T>::VERSION_MISMATCH;
let mut vec = Self::version().serialize();
bincode::serialize_into(vec.by_ref(), value)?;
@@ -409,10 +411,10 @@
T: Deserialize<'a> + Versioned,
{
#[allow(clippy::let_unit_value)]
- let _ = VersionChecker::<VER_MAJOR, VER_MINOR, T>::VERSION_MISMATCH;
+ let _ = VersionChecker::<VER, T>::VERSION_MISMATCH;
let (ver, rest) = Version::deserialize(bytes)?;
- if ver.major != VER_MAJOR || ver.minor != VER_MINOR {
+ if ver.major != VER::MAJOR || ver.minor != VER::MINOR {
return Err(anyhow!(
"Version Mismatch! Expected {}, got {}",
ver,
@@ -427,17 +429,19 @@
mod test {
use serde::{Deserialize, Serialize};
- use crate::{binary_serializer::BinarySerializer, version::Version};
+ use crate::{
+ binary_serializer::BinarySerializer,
+ version::{StaticVersion, Version},
+ versioned::Versioned,
+ };
use super::{BincodeSerializer, VersionedBinarySerializer, VersionedBincodeSerializer};
mod version_0_1 {
- use crate::versioned::Versioned;
-
use super::*;
- pub type Serializer = BincodeSerializer<0u16, 1u16>;
- pub type VSerializer = VersionedBincodeSerializer<0u16, 1u16>;
+ pub type Serializer = BincodeSerializer<StaticVersion<0u16, 1u16>>;
+ pub type VSerializer = VersionedBincodeSerializer<StaticVersion<0u16, 1u16>>;
#[derive(Serialize, Deserialize)]
pub struct Thing {
@@ -457,19 +461,17 @@
mod version_0_2 {
use super::*;
- pub type Serializer = BincodeSerializer<0u16, 2u16>;
- pub type VSerializer = VersionedBincodeSerializer<0u16, 2u16>;
+ pub type Serializer = BincodeSerializer<StaticVersion<0u16, 2u16>>;
+ pub type VSerializer = VersionedBincodeSerializer<StaticVersion<0u16, 2u16>>;
pub type Thing = version_0_1::Thing;
}
mod version_0_3 {
- use crate::versioned::Versioned;
-
use super::*;
- pub type Serializer = BincodeSerializer<0u16, 3u16>;
- pub type VSerializer = VersionedBincodeSerializer<0u16, 3u16>;
+ pub type Serializer = BincodeSerializer<StaticVersion<0u16, 3u16>>;
+ pub type VSerializer = VersionedBincodeSerializer<StaticVersion<0u16, 3u16>>;
#[derive(Serialize, Deserialize)]
pub struct Thing {
diff --git a/src/versioned_binary_serialization/version.rs.html b/src/versioned_binary_serialization/version.rs.html
index 18e8c73..24d5035 100644
--- a/src/versioned_binary_serialization/version.rs.html
+++ b/src/versioned_binary_serialization/version.rs.html
@@ -51,6 +51,32 @@
50
51
52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
use anyhow::anyhow;
use core::fmt::Debug;
use displaydoc::Display;
@@ -87,12 +113,31 @@
}
}
+pub trait StaticVersionType: Clone + Copy + Debug + private::Sealed {
+ const MAJOR: u16;
+ const MINOR: u16;
+
+ fn version() -> Version {
+ Version {
+ major: Self::MAJOR,
+ minor: Self::MINOR,
+ }
+ }
+}
+
#[derive(Clone, Copy, Display)]
pub struct StaticVersion<const MAJOR: u16, const MINOR: u16>;
-impl<const MAJOR: u16, const MINOR: u16> StaticVersion<MAJOR, MINOR> {
- pub const MAJOR: u16 = MAJOR;
- pub const MINOR: u16 = MINOR;
+impl<const MAJOR: u16, const MINOR: u16> StaticVersionType for StaticVersion<MAJOR, MINOR> {
+ const MAJOR: u16 = MAJOR;
+ const MINOR: u16 = MINOR;
+
+ fn version() -> Version {
+ Version {
+ major: Self::MAJOR,
+ minor: Self::MINOR,
+ }
+ }
}
impl<const MAJOR: u16, const MINOR: u16> Debug for StaticVersion<MAJOR, MINOR> {
@@ -103,4 +148,11 @@
.finish()
}
}
+
+mod private {
+ pub trait Sealed {}
+
+ // Implement for those same types, but no others.
+ impl<const MAJOR: u16, const MINOR: u16> Sealed for super::StaticVersion<MAJOR, MINOR> {}
+}