use make_fields::HasFields; use std::collections::HashMap; use std::default::Default; #[derive(HasFields)] struct AppConfig { db: HashMap, port: u16, host: String, } #[derive(HasFields)] struct SomeOtherDbHolder { #[skip_class] db: HashMap, } impl Default for AppConfig { fn default() -> AppConfig { AppConfig { db: HashMap::new(), port: 3000, host: "127.0.0.1".to_string(), } } } fn connect_to_server(holder: &T) -> Result<(&Port, &Host), ()> where T: HasPort + HasHost, { Ok((holder.port(), holder.host())) } fn get_hello_world_from_db(db_handle: &T) -> Option where T: HasDb>, { db_handle.db().get("hello_world").cloned() } #[test] fn test_make_fields_works() { let config = AppConfig::default(); assert_eq!(config.db(), &HashMap::new()); assert_eq!(config.port(), &3000); assert_eq!(config.host(), "127.0.0.1"); } #[test] fn test_function_that_uses_field_traits_works() { let config = AppConfig::default(); let result = connect_to_server(&config); assert_eq!(result, Ok((config.port(), config.host()))); } #[test] fn test_function_that_uses_field_traits_works_with_different_objects() { let config = AppConfig::default(); let other_holder = SomeOtherDbHolder { db: HashMap::new() }; let result1 = get_hello_world_from_db(&config); let result2 = get_hello_world_from_db(&other_holder); assert_eq!(None, result1); assert_eq!(None, result2); }