1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
use ::crossterm::style::{Attribute, Color}; use crate::style::CellAlignment; /// The representation of a single cell in a table row. /// Each cell contains a string, which will later be displayed at the respective row/column. #[derive(Clone)] pub struct Cell { /// Content is a list of strings. /// This is done to handle newlines more easily. /// On set_content, the incoming string is split by '\n' pub(crate) content: Vec<String>, pub(crate) alignment: Option<CellAlignment>, pub(crate) fg: Option<Color>, pub(crate) bg: Option<Color>, pub(crate) attributes: Vec<Attribute>, } impl Cell { /// Create a new Cell pub fn new<T: ToString>(content: T) -> Self { Cell { content: content .to_string() .split('\n') .map(|content| content.to_string()) .collect(), alignment: None, fg: None, bg: None, attributes: Vec::new(), } } /// Return a copy of the content contained in this cell. pub fn get_content(&self) -> String { return self.content.join("\n").clone(); } /// Set the alignment of content for this cell. /// /// Setting this overwrites alignment settings of the Column for this specific Cell. /// ``` /// use comfy_table::style::CellAlignment; /// use comfy_table::cell::Cell; /// /// let mut cell = Cell::new("Some content") /// .set_alignment(CellAlignment::Center); /// ``` pub fn set_alignment(mut self, alignment: CellAlignment) -> Self { self.alignment = Some(alignment); self } /// Set the foreground text color for this cell. /// comfy-table uses [Crossterm Colors](crossterm::style::Color). /// Look at their documentation for all possible Colors. /// ``` /// use comfy_table::style::Color; /// use comfy_table::cell::Cell; /// /// let mut cell = Cell::new("Some content") /// .fg(Color::Red); /// ``` pub fn fg(mut self, color: Color) -> Self { self.fg = Some(color); self } /// Set the background color for this cell. /// comfy-table uses [Crossterm Colors](crossterm::style::Color). /// Look at their documentation for all possible Colors. /// ``` /// use comfy_table::style::Color; /// use comfy_table::cell::Cell; /// /// let mut cell = Cell::new("Some content") /// .bg(Color::Red); /// ``` pub fn bg(mut self, color: Color) -> Self { self.bg = Some(color); self } /// Add a styling attribute to the content cell /// Those can be **bold**, _italic_, blinking and many more. /// comfy-table uses [Crossterm Attributes](crossterm::style::Attribute). /// Look at their documentation for all possible Attributes. /// ``` /// use comfy_table::style::Attribute; /// use comfy_table::cell::Cell; /// /// let mut cell = Cell::new("Some content") /// .add_attribute(Attribute::Bold); /// ``` pub fn add_attribute(mut self, attribute: Attribute) -> Self { self.attributes.push(attribute); self } /// Same as add_attribute, but you can pass a Vector of Attributes pub fn add_attributes(mut self, mut attribute: Vec<Attribute>) -> Self { self.attributes.append(&mut attribute); self } } /// Allow the conversion of a type to a vector of cells. /// By default this is implemented for all types implementing /// IntoIterator where the iterated Item type implements ToString. /// E.g. a Vec<i32> works pub trait ToCells { fn to_cells(self) -> Vec<Cell>; } impl<T: IntoIterator> ToCells for T where T::Item: ToCell, { fn to_cells(self) -> Vec<Cell> { self.into_iter().map(|item| item.to_cell()).collect() } } pub trait ToCell { fn to_cell(self) -> Cell; } impl<T: ToString> ToCell for T { fn to_cell(self) -> Cell { Cell::new(self.to_string()) } } impl ToCell for Cell { fn to_cell(self) -> Cell { self } }