blob: 8d7d864347a3dd93ae28a8a8da52eb64d88227cd [file] [log] [blame]
//! This example demonstrates using the [`Extract`] [`TableOption`] to
//! produce a subsection of a [`Table`].
//!
//! * [`Extract`] can return a new [`Table`] with three functions:
//! * `rows()` | yields subset of the initial rows
//! * `columns()` | yields subset of the initial columns
//! * `segment()` | yields subsection of the initial table
//!
//! * Note how [`Extract`] methods accepts [`RangeBounds`] arguments,
//! making subset specifications concise.
use std::fmt::{Display, Formatter};
use tabled::{
settings::{
object::{Columns, Rows},
Alignment, Extract, Format, Modify, Style,
},
Table, Tabled,
};
#[derive(Tabled)]
struct Album {
artist: &'static str,
name: &'static str,
released: &'static str,
level_of_greatness: LevelOfGreatness,
}
impl Album {
fn new(
artist: &'static str,
name: &'static str,
released: &'static str,
level_of_greatness: LevelOfGreatness,
) -> Self {
Self {
artist,
name,
released,
level_of_greatness,
}
}
}
#[derive(Debug)]
enum LevelOfGreatness {
Supreme,
Outstanding,
Unparalleled,
}
impl Display for LevelOfGreatness {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
std::fmt::Debug::fmt(&self, f)
}
}
fn main() {
use LevelOfGreatness::*;
let data = [
Album::new(
"Pink Floyd",
"The Dark Side of the Moon",
"01 March 1973",
Unparalleled,
),
Album::new("Fleetwood Mac", "Rumours", "04 February 1977", Outstanding),
Album::new(
"Led Zeppelin",
"Led Zeppelin IV",
"08 November 1971",
Supreme,
),
];
println!("Full");
let mut table = Table::new(data);
table
.with(Style::modern())
.with(Modify::new(Rows::first()).with(Alignment::center()))
.with(Modify::new(Rows::new(1..)).with(Alignment::left()));
println!("{table}");
println!("Segment row: (1..=2) column: (1..)");
let table = table.with(Extract::segment(1..=2, 1..));
println!("{table}");
println!("Refinished segment");
let highlight = Format::content(|s| {
if s == "Outstanding" {
format!("+{s}+")
} else {
s.to_string()
}
});
let table = table
.with(Style::modern())
.with(Modify::new(Columns::new(1..)).with(highlight));
println!("{table}");
}