use std::ops::Deref;
use std::slice::Iter;
#[derive(Clone, Debug, PartialEq)]
pub struct Item(pub String);
impl Deref for Item {
type Target = str;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum ListKind {
Enumerate,
Itemize,
}
impl ListKind {
pub fn environment_name(&self) -> &str {
match *self {
ListKind::Enumerate => "enumerate",
ListKind::Itemize => "itemize",
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct List {
pub kind: ListKind,
items: Vec<Item>,
}
impl List {
pub fn new(kind: ListKind) -> List {
List {
kind,
items: Vec::new(),
}
}
pub fn push<S: AsRef<str>>(&mut self, item: S) -> &mut Self {
self.items.push(Item(item.as_ref().to_string()));
self
}
pub fn iter(&self) -> Iter<Item> {
self.items.iter()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn push_item_to_list() {
let mut list = List::new(ListKind::Itemize);
assert_eq!(list.items.len(), 0);
list.push("Hello World");
assert_eq!(list.items.len(), 1);
}
}