#[derive(Clone, Debug)] struct Context { id: i32, param: String, } trait FromSourceRef { fn from_source_ref(source: &Source) -> Self; } struct Id(pub i32); impl FromSourceRef for Id { fn from_source_ref(context: &Context) -> Self { Id(context.id) } } struct Param(pub String); impl FromSourceRef for Param { fn from_source_ref(context: &Context) -> Self { Param(context.param.clone()) } } fn print_id(Id(id): Id) { println!("id is {id}"); } fn print_all(Param(param): Param, Id(id): Id) { println!("id is {id} and param is {param}") } trait MagicFunction { fn call(self, context: C); } impl, C> MagicFunction<(T,), C> for F { fn call(self, context: C) { (self)(T::from_source_ref(&context)) } } impl, T2: FromSourceRef, C> MagicFunction<(T1, T2), C> for F { fn call(self, context: C) { (self)(T1::from_source_ref(&context), T2::from_source_ref(&context)) } } fn trigger(function: impl MagicFunction, context: C) { function.call(context) } fn main() { let context = Context { id: 82137, param: "bruh".into(), }; trigger(print_id, context.clone()); trigger(print_all, context.clone()); }