1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
use serde_derive::{Deserialize, Serialize}; pub type IdType = i64; pub type VersionType = i32; #[derive(Clone, Serialize, Deserialize)] pub struct Model<DATA> where DATA: Clone + serde::ser::Serialize, { pub id: IdType, pub version: VersionType, #[serde(bound(deserialize = "DATA: serde::Deserialize<'de>"))] pub data: DATA, } impl<DATA> Model<DATA> where DATA: Clone + serde::ser::Serialize + serde::de::DeserializeOwned, { pub fn into_new(self) -> NewModel<DATA> { NewModel { version: 0, data: self.data, } } } #[derive(Clone, Serialize, Deserialize)] pub struct NewModel<DATA> where DATA: Clone + serde::ser::Serialize, { pub version: VersionType, #[serde(bound(deserialize = "DATA: serde::Deserialize<'de>"))] pub data: DATA, } impl<DATA> NewModel<DATA> where DATA: Clone + serde::ser::Serialize + serde::de::DeserializeOwned, { pub fn new(data: DATA) -> Self { NewModel { version: 0, data } } } impl<DATA> From<DATA> for NewModel<DATA> where DATA: Clone + serde::ser::Serialize + serde::de::DeserializeOwned, { fn from(data: DATA) -> Self { NewModel::new(data) } } impl<'a, DATA> Into<&'a IdType> for &'a Model<DATA> where DATA: Clone + serde::ser::Serialize + serde::de::DeserializeOwned, { fn into(self) -> &'a IdType { &self.id } } #[cfg(test)] mod test { use super::*; use serde_derive::{Deserialize, Serialize}; use serde_json; #[test] fn model_should_be_serializable() -> Result<(), Box<dyn std::error::Error>> { let model = Model { id: 1, version: 1, data: SimpleData { name: "test".to_owned(), }, }; let serialize = serde_json::to_string(&model)?; let deserialize: Model<SimpleData> = serde_json::from_str(&serialize)?; assert_eq!(model.id, deserialize.id); assert_eq!(model.version, deserialize.version); assert_eq!(model.data, deserialize.data); Ok(()) } #[test] fn new_model_should_be_serializable() -> Result<(), Box<dyn std::error::Error>> { let model = NewModel::new(SimpleData { name: "test".to_owned(), }); let serialize = serde_json::to_string(&model)?; let deserialize: NewModel<SimpleData> = serde_json::from_str(&serialize)?; assert_eq!(model.version, deserialize.version); assert_eq!(model.data, deserialize.data); Ok(()) } #[derive(Clone, Serialize, Deserialize, PartialEq, Debug)] struct SimpleData { name: String, } }