pub mod enumerator;
use lipgloss::Style;
use lipgloss_tree::{Children, Leaf, Node, Tree};
use std::fmt;
pub use enumerator::{alphabet, arabic, asterisk, bullet, dash, roman, Enumerator, Indenter};
pub type Items = Box<dyn Children>;
pub type StyleFunc = fn(&dyn Children, usize) -> Style;
pub struct List {
tree: Tree,
}
impl List {
pub fn new() -> Self {
let mut tree = Tree::new();
tree = tree
.enumerator(bullet as lipgloss_tree::Enumerator)
.indenter(list_indenter);
Self { tree }
}
pub fn from_items(items: Vec<&str>) -> Self {
let mut list = Self::new();
for item in items {
list = list.item(item);
}
list
}
pub fn hidden(&self) -> bool {
self.tree.hidden()
}
pub fn hide(mut self, hide: bool) -> Self {
self.tree = self.tree.hide(hide);
self
}
pub fn offset(mut self, start: usize, end: usize) -> Self {
self.tree = self.tree.offset(start, end);
self
}
pub fn value(&self) -> String {
self.tree.value()
}
pub fn enumerator_style(mut self, style: Style) -> Self {
self.tree = self.tree.enumerator_style(style);
self
}
pub fn enumerator_style_func(mut self, f: StyleFunc) -> Self {
self.tree = self
.tree
.enumerator_style_func(f as lipgloss_tree::StyleFunc);
self
}
pub fn indenter(mut self, indenter: Indenter) -> Self {
self.tree = self.tree.indenter(indenter as lipgloss_tree::Indenter);
self
}
pub fn item_style(mut self, style: Style) -> Self {
self.tree = self.tree.item_style(style);
self
}
pub fn item_style_func(mut self, f: StyleFunc) -> Self {
self.tree = self.tree.item_style_func(f as lipgloss_tree::StyleFunc);
self
}
pub fn item(mut self, item: &str) -> Self {
let leaf: Box<dyn Node> = Box::new(Leaf::new(item, false));
self.tree = self.tree.add_child(leaf);
self
}
pub fn item_node(mut self, node: Box<dyn Node>) -> Self {
self.tree = self.tree.add_child(node);
self
}
pub fn item_list(mut self, list: List) -> Self {
let node: Box<dyn Node> = Box::new(list.tree);
self.tree = self.tree.add_child(node);
self
}
pub fn items(mut self, items: Vec<&str>) -> Self {
for item in items {
self = self.item(item);
}
self
}
pub fn enumerator(mut self, enumerator: Enumerator) -> Self {
self.tree = self
.tree
.enumerator(enumerator as lipgloss_tree::Enumerator);
self
}
}
impl Default for List {
fn default() -> Self {
Self::new()
}
}
impl fmt::Display for List {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.tree)
}
}
fn list_indenter(_children: &dyn Children, _index: usize) -> String {
" ".to_string() }
pub use List as ListType;
pub fn new() -> List {
List::new()
}
pub fn from_items(items: Vec<&str>) -> List {
List::from_items(items)
}