//! https://poignardazur.github.io/2023/11/08/time-for-variadic-generics/ use std::fmt::{Debug, DebugTuple, Formatter, Result}; use variadics::{var_args, var_expr, var_type, Variadic}; #[sealed::sealed] pub trait DebugVariadicTrait { fn apply(&self, f: &mut DebugTuple); } #[sealed::sealed] impl DebugVariadicTrait for () { fn apply(&self, _f: &mut DebugTuple) {} } #[sealed::sealed] impl DebugVariadicTrait for var_type!(Head, ...Tail) { fn apply(&self, f: &mut DebugTuple) { let var_args!(head, ...tail) = self; f.field(head); tail.apply(f); } } pub struct DebugVariadic(V); impl Debug for DebugVariadic { fn fmt(&self, f: &mut Formatter<'_>) -> Result { self.0.apply(&mut f.debug_tuple("")); Ok(()) } } fn main() { let var_tuple = var_expr!("hello", 1, 'w'); let var_tuple = DebugVariadic(var_tuple); println!("{:?}", var_tuple); } // impl Debug for Ts { // fn fmt(&self, f: &mut Formatter<'_>) -> Result { // let mut f = f.debug_tuple(""); // self.apply(f); // f.finish() // } // }