#![allow(dead_code, deprecated, unused_variables, unused_mut)] #![feature(error_generic_member_access)] use core::error::Request; use core::error::request_value; #[derive(Debug)] struct Parent(Option); impl std::fmt::Display for Parent { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "a parent failed") } } impl std::error::Error for Parent { fn provide<'a>(&'a self, request: &mut Request<'a>) { if let Some(v) = self.0 { request.provide_value::(v); } } } #[derive(Debug)] struct Child { parent: Parent, } impl Child { fn an_expensive_computation(&self) -> Option { Some(99) } } impl std::fmt::Display for Child { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "child failed: \n because of parent: {}", self.parent) } } impl std::error::Error for Child { fn provide<'a>(&'a self, request: &mut Request<'a>) { self.parent.provide(request); if request.would_be_satisfied_by_value_of::() { if let Some(v) = self.an_expensive_computation() { request.provide_value::(v); } } assert!(! request.would_be_satisfied_by_value_of::< u8 > ()); } } fn main() { let parent = Parent(Some(42)); let child = Child { parent }; assert_eq!(Some(42), request_value::< u8 > (& child)); let parent = Parent(None); let child = Child { parent }; assert_eq!(Some(99), request_value::< u8 > (& child)); }