#[cfg(feature = "derive")]
fn main() {
use gilt::prelude::*;
use gilt::Table;
let mut console = Console::new();
console.print_text("\n[bold cyan]1. Basic derive — fields become Title Case headers[/]");
#[derive(Table)]
struct Planet {
name: String,
mass_kg: f64,
moons: u32,
}
let planets = vec![
Planet {
name: "Mercury".into(),
mass_kg: 3.3e23,
moons: 0,
},
Planet {
name: "Venus".into(),
mass_kg: 4.87e24,
moons: 0,
},
Planet {
name: "Earth".into(),
mass_kg: 5.97e24,
moons: 1,
},
Planet {
name: "Mars".into(),
mass_kg: 6.42e23,
moons: 2,
},
];
console.print(&Planet::to_table(&planets));
console.print_text("\n[bold cyan]2. Table-level — title, caption, box_style, styles[/]");
#[derive(Table)]
#[table(
title = "Q4 Sales Report",
caption = "All figures in USD",
box_style = "ROUNDED",
header_style = "bold white on blue",
border_style = "bright_blue",
title_style = "bold magenta",
caption_style = "dim italic",
show_lines = true,
pad_edge = true
)]
struct Sale {
region: String,
product: String,
revenue: f64,
units: u32,
}
let sales = vec![
Sale {
region: "North".into(),
product: "Widget A".into(),
revenue: 15420.50,
units: 342,
},
Sale {
region: "South".into(),
product: "Widget B".into(),
revenue: 8930.00,
units: 178,
},
Sale {
region: "East".into(),
product: "Widget A".into(),
revenue: 22100.75,
units: 491,
},
Sale {
region: "West".into(),
product: "Widget C".into(),
revenue: 6750.25,
units: 135,
},
];
console.print(&Sale::to_table(&sales));
console.print_text("\n[bold cyan]3. Column-level — rename, justify, style, width[/]");
#[derive(Table)]
#[table(title = "Server Status", box_style = "HEAVY", header_style = "bold")]
struct Server {
#[column(header = "Hostname", style = "bold cyan", min_width = 15)]
name: String,
#[column(header = "CPU %", justify = "right", style = "yellow")]
cpu: f32,
#[column(header = "Mem %", justify = "right", style = "green")]
memory: f32,
#[column(header = "Status", justify = "center")]
status: String,
#[column(skip)]
#[allow(dead_code)]
internal_id: u64,
}
let servers = vec![
Server {
name: "web-prod-01".into(),
cpu: 45.2,
memory: 62.1,
status: "OK".into(),
internal_id: 1001,
},
Server {
name: "web-prod-02".into(),
cpu: 78.9,
memory: 85.3,
status: "WARN".into(),
internal_id: 1002,
},
Server {
name: "db-primary".into(),
cpu: 23.1,
memory: 41.7,
status: "OK".into(),
internal_id: 2001,
},
Server {
name: "cache-01".into(),
cpu: 12.5,
memory: 28.9,
status: "OK".into(),
internal_id: 3001,
},
];
console.print(&Server::to_table(&servers));
console.print_text("\n[bold cyan]4. Alternating row styles[/]");
#[derive(Table)]
#[table(
title = "Inventory",
box_style = "SIMPLE",
row_styles = "on grey11, ",
header_style = "bold underline"
)]
struct Item {
#[column(header = "SKU", style = "dim")]
sku: String,
#[column(header = "Product")]
name: String,
#[column(header = "Qty", justify = "right")]
quantity: u32,
#[column(header = "Price", justify = "right", style = "green")]
price: String,
}
let items = vec![
Item {
sku: "A-001".into(),
name: "Mechanical Keyboard".into(),
quantity: 45,
price: "$89.99".into(),
},
Item {
sku: "A-002".into(),
name: "Wireless Mouse".into(),
quantity: 120,
price: "$34.50".into(),
},
Item {
sku: "B-010".into(),
name: "USB-C Hub".into(),
quantity: 67,
price: "$49.99".into(),
},
Item {
sku: "B-011".into(),
name: "Monitor Arm".into(),
quantity: 23,
price: "$129.00".into(),
},
Item {
sku: "C-100".into(),
name: "Webcam HD".into(),
quantity: 89,
price: "$59.95".into(),
},
Item {
sku: "C-101".into(),
name: "Headset Pro".into(),
quantity: 34,
price: "$149.00".into(),
},
];
console.print(&Item::to_table(&items));
console.print_text("\n[bold cyan]5. Expanded table with column ratios[/]");
#[derive(Table)]
#[table(
title = "Task Board",
box_style = "DOUBLE",
expand = true,
header_style = "bold white on dark_green",
border_style = "green"
)]
struct Task {
#[column(header = "ID", justify = "center", ratio = 1)]
id: u32,
#[column(header = "Task", ratio = 4)]
description: String,
#[column(header = "Owner", ratio = 2)]
assignee: String,
#[column(header = "Priority", justify = "center", ratio = 1, style = "bold")]
priority: String,
}
let tasks = vec![
Task {
id: 1,
description: "Implement auth middleware".into(),
assignee: "Alice".into(),
priority: "High".into(),
},
Task {
id: 2,
description: "Fix pagination bug on /users".into(),
assignee: "Bob".into(),
priority: "Med".into(),
},
Task {
id: 3,
description: "Add CSV export endpoint".into(),
assignee: "Charlie".into(),
priority: "Low".into(),
},
Task {
id: 4,
description: "Update dependencies".into(),
assignee: "Diana".into(),
priority: "Med".into(),
},
];
console.print(&Task::to_table(&tasks));
console.print_text("\n[bold cyan]6. Minimal — no edge, hidden header[/]");
#[derive(Table)]
#[table(show_header = false, show_edge = false, box_style = "SIMPLE")]
struct LogEntry {
#[column(style = "dim")]
timestamp: String,
#[column(style = "bold yellow")]
level: String,
message: String,
}
let logs = vec![
LogEntry {
timestamp: "12:01:03".into(),
level: "INFO".into(),
message: "Server started on :8080".into(),
},
LogEntry {
timestamp: "12:01:05".into(),
level: "WARN".into(),
message: "Config file not found, using defaults".into(),
},
LogEntry {
timestamp: "12:01:12".into(),
level: "INFO".into(),
message: "Connected to database".into(),
},
LogEntry {
timestamp: "12:02:45".into(),
level: "ERR".into(),
message: "Failed to reach payment API".into(),
},
];
console.print(&LogEntry::to_table(&logs));
console.print_text("\n[bold cyan]7. Box style showcase[/]");
macro_rules! box_demo {
($name:ident, $style:literal) => {
#[derive(Table)]
#[table(title = $style, box_style = $style)]
struct $name {
a: String,
b: String,
}
let data = vec![$name {
a: "Hello".into(),
b: "World".into(),
}];
console.print(&$name::to_table(&data));
};
}
box_demo!(BoxAscii, "ASCII");
box_demo!(BoxSquare, "SQUARE");
box_demo!(BoxRounded, "ROUNDED");
box_demo!(BoxHeavy, "HEAVY");
box_demo!(BoxDouble, "DOUBLE");
box_demo!(BoxMinimal, "MINIMAL");
box_demo!(BoxMarkdown, "MARKDOWN");
console.print_text("\n[bold cyan]8. Column constraints — max_width and no_wrap[/]");
#[derive(Table)]
#[table(title = "Error Log", box_style = "ROUNDED", header_style = "bold")]
struct ErrorEntry {
#[column(header = "Time", no_wrap, style = "dim")]
timestamp: String,
#[column(header = "Code", justify = "center", width = 6)]
code: u16,
#[column(header = "Message", max_width = 40)]
message: String,
#[column(header = "Source", max_width = 20, style = "cyan")]
source: String,
}
let errors = vec![
ErrorEntry {
timestamp: "2026-02-09 14:23:01".into(),
code: 500,
message: "Connection refused: upstream server at 10.0.0.5:8080 is not responding to health checks".into(),
source: "api-gateway/proxy.rs:142".into(),
},
ErrorEntry {
timestamp: "2026-02-09 14:23:03".into(),
code: 429,
message: "Rate limit exceeded for client_id=abc123, retry after 30s".into(),
source: "middleware/rate_limit.rs:88".into(),
},
ErrorEntry {
timestamp: "2026-02-09 14:23:07".into(),
code: 404,
message: "Not found".into(),
source: "router/dispatch.rs:201".into(),
},
];
console.print(&ErrorEntry::to_table(&errors));
console.print_text("\n[bold cyan]9. Per-column header styles[/]");
#[derive(Table)]
#[table(
title = "Deployment Matrix",
box_style = "HEAVY_HEAD",
border_style = "dim"
)]
struct Deployment {
#[column(
header = "Service",
header_style = "bold white on dark_blue",
min_width = 14
)]
service: String,
#[column(
header = "Staging",
header_style = "bold white on dark_orange",
justify = "center"
)]
staging: String,
#[column(
header = "Production",
header_style = "bold white on dark_red",
justify = "center"
)]
production: String,
#[column(
header = "Version",
header_style = "bold white on dark_green",
justify = "right"
)]
version: String,
}
let deploys = vec![
Deployment {
service: "auth-service".into(),
staging: "v2.4.1".into(),
production: "v2.3.0".into(),
version: "behind".into(),
},
Deployment {
service: "user-api".into(),
staging: "v1.12.0".into(),
production: "v1.12.0".into(),
version: "synced".into(),
},
Deployment {
service: "billing".into(),
staging: "v3.0.0-rc1".into(),
production: "v2.9.8".into(),
version: "behind".into(),
},
Deployment {
service: "notifications".into(),
staging: "v1.5.2".into(),
production: "v1.5.2".into(),
version: "synced".into(),
},
];
console.print(&Deployment::to_table(&deploys));
console.print_text("\n[bold cyan]10. Kitchen sink — all attributes combined[/]");
#[derive(Table)]
#[table(
title = "Employee Directory",
caption = "Confidential — Internal Use Only",
box_style = "DOUBLE_EDGE",
header_style = "bold white on dark_green",
border_style = "green",
title_style = "bold underline",
caption_style = "dim red italic",
show_lines = true,
pad_edge = true,
row_styles = "on grey7, "
)]
struct Employee {
#[column(header = "ID", justify = "right", style = "dim", width = 5)]
id: u32,
#[column(header = "Name", style = "bold", min_width = 16)]
name: String,
#[column(header = "Role", max_width = 24)]
role: String,
#[column(header = "Dept", header_style = "bold yellow", justify = "center")]
department: String,
#[column(header = "Salary", justify = "right", style = "green", no_wrap)]
salary: String,
#[column(skip)]
#[allow(dead_code)]
ssn: String,
}
let employees = vec![
Employee {
id: 1,
name: "Alice Chen".into(),
role: "Staff Engineer".into(),
department: "Platform".into(),
salary: "$185,000".into(),
ssn: "xxx-xx-1234".into(),
},
Employee {
id: 2,
name: "Bob Martinez".into(),
role: "Engineering Manager".into(),
department: "Backend".into(),
salary: "$195,000".into(),
ssn: "xxx-xx-5678".into(),
},
Employee {
id: 3,
name: "Carol Washington".into(),
role: "Senior Product Designer".into(),
department: "Design".into(),
salary: "$165,000".into(),
ssn: "xxx-xx-9012".into(),
},
Employee {
id: 4,
name: "David Kim".into(),
role: "DevOps Lead".into(),
department: "Platform".into(),
salary: "$175,000".into(),
ssn: "xxx-xx-3456".into(),
},
];
console.print(&Employee::to_table(&employees));
}
#[cfg(not(feature = "derive"))]
fn main() {
eprintln!("This example requires the 'derive' feature: cargo run --example derive_table --features derive");
}