blob: ad9caff77793afcddc3ba824f30300f41ab9d5eb [file] [log] [blame]
//! The module contains [`Height`] structure which is responsible for a table and cell height.
mod cell_height_increase;
mod cell_height_limit;
mod height_list;
mod table_height_increase;
mod table_height_limit;
mod util;
use crate::settings::measurement::Measurement;
pub use cell_height_increase::CellHeightIncrease;
pub use cell_height_limit::CellHeightLimit;
pub use height_list::HeightList;
pub use table_height_increase::TableHeightIncrease;
pub use table_height_limit::TableHeightLimit;
/// Height is a abstract factory for height settings.
///
/// # Example
///
/// ```
/// use tabled::{Table, settings::{Height, Settings}};
///
/// let data = vec![
/// ("Some data", "here", "and here"),
/// ("Some data on a next", "line", "right here"),
/// ];
///
/// let table = Table::new(data)
/// .with(Settings::new(Height::limit(10), Height::increase(10)))
/// .to_string();
///
/// assert_eq!(
/// table,
/// "+---------------------+------+------------+\n\
/// | &str | &str | &str |\n\
/// | | | |\n\
/// +---------------------+------+------------+\n\
/// | Some data | here | and here |\n\
/// | | | |\n\
/// +---------------------+------+------------+\n\
/// | Some data on a next | line | right here |\n\
/// | | | |\n\
/// +---------------------+------+------------+",
/// )
/// ```
#[derive(Debug)]
pub struct Height;
impl Height {
/// Create [`CellHeightIncrease`] to set a table/cell height.
///
/// # Example
///
/// ## Cell height
///
/// ```
/// use tabled::{Table, settings::{Height, Modify, object::Columns}};
///
/// let data = vec![
/// ("Some data", "here", "and here"),
/// ("Some data on a next", "line", "right here"),
/// ];
///
/// let table = Table::new(data)
/// .with(Modify::new(Columns::first()).with(Height::increase(5)))
/// .to_string();
///
/// assert_eq!(
/// table,
/// "+---------------------+------+------------+\n\
/// | &str | &str | &str |\n\
/// | | | |\n\
/// | | | |\n\
/// | | | |\n\
/// | | | |\n\
/// +---------------------+------+------------+\n\
/// | Some data | here | and here |\n\
/// | | | |\n\
/// | | | |\n\
/// | | | |\n\
/// | | | |\n\
/// +---------------------+------+------------+\n\
/// | Some data on a next | line | right here |\n\
/// | | | |\n\
/// | | | |\n\
/// | | | |\n\
/// | | | |\n\
/// +---------------------+------+------------+"
/// )
/// ```
///
/// ## Table height
///
/// ```
/// use tabled::{Table, settings::Height};
///
/// let data = vec![
/// ("Some data", "here", "and here"),
/// ("Some data on a next", "line", "right here"),
/// ];
///
/// let table = Table::new(data)
/// .with(Height::increase(10))
/// .to_string();
///
/// assert_eq!(
/// table,
/// "+---------------------+------+------------+\n\
/// | &str | &str | &str |\n\
/// | | | |\n\
/// +---------------------+------+------------+\n\
/// | Some data | here | and here |\n\
/// | | | |\n\
/// +---------------------+------+------------+\n\
/// | Some data on a next | line | right here |\n\
/// | | | |\n\
/// +---------------------+------+------------+",
/// )
/// ```
pub fn increase<W: Measurement<Height>>(width: W) -> CellHeightIncrease<W> {
CellHeightIncrease::new(width)
}
/// Create [`CellHeightLimit`] to set a table/cell height.
///
/// # Example
///
/// ## Cell height
///
/// ```
/// use tabled::{Table, settings::{Height, Modify, object::Columns}};
///
/// let data = vec![
/// ("Some\ndata", "here", "and here"),
/// ("Some\ndata on a next", "line", "right here"),
/// ];
///
/// let table = Table::new(data)
/// .with(Modify::new(Columns::first()).with(Height::limit(1)))
/// .to_string();
///
/// assert_eq!(
/// table,
/// "+------+------+------------+\n\
/// | &str | &str | &str |\n\
/// +------+------+------------+\n\
/// | Some | here | and here |\n\
/// +------+------+------------+\n\
/// | Some | line | right here |\n\
/// +------+------+------------+"
/// )
/// ```
///
/// ## Table height
///
/// ```
/// use tabled::{Table, settings::Height};
///
/// let data = vec![
/// ("Some\ndata", "here", "and here"),
/// ("Some\ndata on a next", "line", "right here"),
/// ];
///
/// let table = Table::new(&data)
/// .with(Height::limit(6))
/// .to_string();
///
/// assert_eq!(
/// table,
/// "+------+------+------------+\n\
/// +------+------+------------+\n\
/// | Some | here | and here |\n\
/// +------+------+------------+\n\
/// | Some | line | right here |\n\
/// +------+------+------------+",
/// );
///
/// let table = Table::new(&data)
/// .with(Height::limit(1))
/// .to_string();
///
/// assert_eq!(
/// table,
/// "+--+--+--+\n\
/// +--+--+--+\n\
/// +--+--+--+\n\
/// +--+--+--+",
/// );
/// ```
pub fn limit<W: Measurement<Height>>(width: W) -> CellHeightLimit<W> {
CellHeightLimit::new(width)
}
/// Create [`HeightList`] to set a table height to a constant list of row heights.
///
/// Notice if you provide a list with `.len()` less than `Table::count_rows` then it will have no affect.
///
/// # Example
///
/// ```
/// use tabled::{Table, settings::{Height, Modify, object::Columns}};
///
/// let data = vec![
/// ("Some\ndata", "here", "and here"),
/// ("Some\ndata on a next", "line", "right here"),
/// ];
///
/// let table = Table::new(data)
/// .with(Height::list([1, 0, 2]))
/// .to_string();
///
/// assert_eq!(
/// table,
/// "+----------------+------+------------+\n\
/// | &str | &str | &str |\n\
/// +----------------+------+------------+\n\
/// +----------------+------+------------+\n\
/// | Some | line | right here |\n\
/// | data on a next | | |\n\
/// +----------------+------+------------+",
/// )
/// ```
pub fn list<I: IntoIterator<Item = usize>>(rows: I) -> HeightList {
HeightList::new(rows.into_iter().collect())
}
}