dochy_diff 0.10.1

Calculates Dochy Diff.
use dochy_core::structs::{LinkedMap, MutItem, MetaTables};
use crate::imp::structs_read::{ListDiffR, ListItemDiffEnumR, CS};
use crate::diff_error::DiffError;
use crate::imp::apply::new_item_from_diff::new_item_from_diff;
use crate::imp::apply::modify_item_from_diff::modify_item_from_diff;

pub(crate) fn apply_list_diff(list : &mut LinkedMap<MutItem>, diff : ListDiffR, meta : &MetaTables)
    -> Result<(), DiffError>{
    let (next_id, vec) = diff.deconstruct();
    list.set_next_id(next_id);
    for (id, diff) in vec{
        match diff{
            ListItemDiffEnumR::Create(CS{ prev_id, diff }) =>{
                if list.insert_first_with_id(id,new_item_from_diff(diff, meta)?) == false{
                    Err("ID is invalid")?
                }
                if let Some(prev_id) = prev_id{
                    if list.move_to_next(prev_id, id) == false{
                        Err(format!("prev_id {} was not found", prev_id))?
                    }
                }
            },
            ListItemDiffEnumR::Delete =>{
                list.remove(id);
            },
            ListItemDiffEnumR::Modify(diff) =>{
                let item = if let Some(item) = list.get_item_mut(id){ item } else{
                    Err("list is invalid apply_list_diff")?
                };
                modify_item_from_diff(item, diff, meta)?;
            }
        }
    }
    Ok(())
}