just-lists-core 0.2.2

Core library for just-lists terminal-based task manager.
Documentation
pub mod list;
pub mod list_item;

use crate::list::List;
use crate::list_item::ListItem;

pub fn get_sample_list() -> List {
    let mut list = List::new();

    let top_item_1 = ListItem::new("First item".to_string());
    let top_item_2 = ListItem::new("Second item".to_string());

    let parent_1_id = top_item_1.id.clone();
    let parent_2_id = top_item_2.id.clone();

    list.add_list_item(top_item_1, None);
    list.add_list_item(top_item_2, None);

    let _ = list.add_child_list_item(
        ListItem::new("First child item".to_string()),
        &parent_1_id,
        None,
    );
    let _ = list.add_child_list_item(
        ListItem::new("Second child item".to_string()),
        &parent_2_id,
        None,
    );

    list
}

#[cfg(test)]
mod tests {
    use core::panic;

    use crate::list::List;
    use crate::list_item::ListItem;

    #[test]
    fn can_get_new_list() {
        let _ = List::new();
    }

    #[test]
    fn can_add_item_to_list() {
        let mut list = List::new();
        list.add_list_item(ListItem::new("First list item".to_string()), None);

        let mut list_length = list.get_top_level_list_items().len();
        assert!(
            list_length == 1,
            "List item length was not 1. Actual: {list_length}"
        );

        list.add_list_item(ListItem::new("Second item".to_string()), None);

        list_length = list.get_top_level_list_items().len();
        assert!(
            list_length == 2,
            "List item length was not 2. Actual: {list_length}"
        );
    }

    #[test]
    fn can_serialize_and_deserialize() {
        let list = super::get_sample_list();

        let serialized = list.into_string();
        let deserialized: List = List::from_string(serialized);

        println!("{:?}", deserialized);
    }

    #[test]
    fn can_remove_list_items() {
        let mut list = super::get_sample_list();

        let top_level_items = list.get_top_level_list_items();

        let item_1_id = top_level_items.first().unwrap().id.clone();
        let item_2_id = top_level_items.last().unwrap().id.clone();

        match list.remove_list_item(&item_1_id) {
            Ok(_value) => (),
            Err(error) => panic!(
                "Expected to successfully remove top level item. Actual:{:?}",
                error
            ),
        };

        let first_child_of_2_id = list
            .get_list_item(
                list.get_list_item(&item_2_id)
                    .unwrap()
                    .children
                    .first()
                    .unwrap(),
            )
            .unwrap()
            .id
            .clone();

        match list.remove_list_item(&first_child_of_2_id) {
            Ok(_value) => (),
            Err(error) => panic!(
                "Expected to successfully remove child level item. Actual:{:?}",
                error
            ),
        }
    }
}