use crate::imp::structs_write::{RootDiffW};
use dochy_compaction::kval_enum::KVal;
use crate::imp::write::store_ids::{StoredIDs, store_ids};
use dochy_core::structs::{RustParam, MetaTable, MetaValue};
use crate::imp::write::write_param::write_param;
use std::collections::BTreeMap;
use crate::imp::write::write_list::{write_ld_lists};
use crate::diff_error::DiffError;
use crate::imp::write::write_store_ids::write_stored_ids;
pub(crate) fn write_root(root : RootDiffW) -> Result<Vec<KVal>, DiffError>{
let params = root.params();
let lists = root.lists();
let meta = root.meta_table();
let mut r : Vec<KVal> = Vec::with_capacity((params.len() + lists.len()) * 2);
let ids = store_ids(params, lists);
write_stored_ids(&ids, &mut r);
match ids{
StoredIDs::Zero =>{
Ok(r)
},
_ =>{
write_params(params, meta, &mut r)?;
write_ld_lists(lists,meta, &mut r)?;
Ok(r)
},
}
}
pub(crate ) fn write_params(params : &BTreeMap<usize, &RustParam>, meta : &MetaTable, r : &mut Vec<KVal>) -> Result<(), DiffError>{
for (&id, ¶m) in params{
if let Some((_,MetaValue::Param(meta_param))) = meta.get(id) {
write_param(param, meta_param, r)?
} else{
panic!("invalid meta");
}
}
Ok(())
}