[−][src]Trait dyn_context::Context
A service provider pattern implementation.
Useful for building complex systems with callbacks without generic parameters.
Examples
mod call_back { use dyn_context::Context; pub struct CallBack { callback: Option<fn(context: &mut dyn Context)> } impl CallBack { pub fn new() -> Self { CallBack { callback: None } } pub fn set_callback(&mut self, callback: fn(context: &mut dyn Context)) { self.callback.replace(callback); } pub fn call_back(&self, context: &mut dyn Context) { self.callback.map(|callback| callback(context)); } } } use std::convert::Into; use dyn_context::{TrivialContext, ContextExt}; use call_back::CallBack; struct PrintContext { value: String } impl TrivialContext for PrintContext { } let mut call_back = CallBack::new(); call_back.set_callback(|context| { let print: &PrintContext = context.get(); println!("{}", &print.value); }); call_back.call_back(&mut PrintContext { value: "Hello, world!".into() });
For using &str
instead of String
the context!
macro can be used:
use dyn_context::{context, ContextExt}; use call_back::CallBack; context! { struct PrintValue in mod print_value { value: ref str } } context! { struct PrintContext in mod print_context { dyn value: ref PrintValue } } let mut call_back = CallBack::new(); call_back.set_callback(|context| { let print_value: &PrintValue = context.get(); println!("{}", print_value.value()); }); PrintValue::call("Hello, world!", |print_value| { PrintContext::call(print_value, |context| call_back.call_back(context)); });