use type_change::From; #[derive(Debug, PartialEq, Eq, Clone)] struct OldState { id: i64, name: String, } #[derive(Debug, PartialEq, Eq, From)] #[from(OldState)] struct NewState { id: i64, name: String, } #[test] fn named_struct() { let old = OldState { id: 1, name: "Panda".to_string(), }; let new: NewState = old.clone().into(); assert_eq!( new, NewState { id: old.id, name: old.name } ); } #[derive(Debug, PartialEq, Eq, From)] struct NewType(OldState); #[test] fn unnamed_struct() { let old = OldState { id: 1, name: "Panda".to_string(), }; let newtype: NewType = old.clone().into(); assert_eq!(newtype, NewType(old)); } mod nested { use super::*; mod new { use super::*; #[derive(Debug, PartialEq, Eq, Clone, From)] #[from(old::Parent)] pub struct Parent { pub id: i64, pub child: Child, } #[derive(Debug, PartialEq, Eq, Clone, From)] #[from(old::Child)] pub struct Child { pub value: String, } } mod old { #[derive(Debug, PartialEq, Eq, Clone)] pub struct Parent { pub id: i64, pub child: Child, } #[derive(Debug, PartialEq, Eq, Clone)] pub struct Child { pub value: String, } } #[test] fn named_struct() { let old = old::Parent { id: 1, child: old::Child { value: "Panda".to_string(), }, }; let new: new::Parent = old.clone().into(); assert_eq!( new, new::Parent { id: old.id, child: new::Child { value: old.child.value } } ); } #[derive(Debug, PartialEq, Eq, From)] struct NewType(old::Parent); #[test] fn unnamed_struct() { let old = old::Parent { id: 1, child: old::Child { value: "Panda".to_string(), }, }; let newtype: NewType = old.clone().into(); assert_eq!(newtype, NewType(old)); } }