| //! This example demonstrates using the [attribute macro](https://doc.rust-lang.org/reference/procedural-macros.html#attribute-macros) |
| //! [`inline`] to expand enum fields to individual columns in a [`Table`] display. |
| //! |
| //! * Note how the optional [`inline`] argument is used to apply prefixes |
| //! to decomposed column headers. This is helpful for organizing tables |
| //! with repetative fields that would normally result in confusing headers. |
| //! |
| //! * Note that without inlining a struct or enum field, those objects |
| //! must implement the [`Display`] trait as they will be represented in |
| //! a single column with the value of their [`ToString`] output. |
| |
| use tabled::{Table, Tabled}; |
| |
| #[derive(Tabled)] |
| enum Contact { |
| #[tabled(inline("telegram::"))] |
| Telegram { |
| username: &'static str, |
| #[tabled(inline("telegram::"))] |
| number: Number, |
| }, |
| #[tabled(inline)] |
| Local(#[tabled(inline("local::"))] Number), |
| } |
| |
| #[derive(Tabled)] |
| struct Number { |
| number: &'static str, |
| code: usize, |
| } |
| |
| impl Number { |
| fn new(number: &'static str, code: usize) -> Self { |
| Self { number, code } |
| } |
| } |
| |
| fn main() { |
| let data = [ |
| Contact::Local(Number::new("654321", 123)), |
| Contact::Telegram { |
| username: "no2Presley", |
| number: Number::new("123456", 123), |
| }, |
| ]; |
| |
| let table = Table::new(data); |
| |
| println!("{table}"); |
| } |