use std::collections::BTreeMap;
use std::ops::Index;
use crate::list_iterator::ListIterator;
use crate::list_iterator::FieldValue;
#[derive(Clone, Debug)]
pub struct ListItem {
fields : BTreeMap<String, FieldValue>,
}
unsafe impl Send for ListItem {}
unsafe impl Sync for ListItem {}
impl ListItem {
fn new() -> ListItem {
ListItem { fields: BTreeMap::new() }
}
fn add(&mut self, name: &str, field: FieldValue) {
self.fields.insert(name.to_string(), field);
}
pub fn get(&self, name: &str) -> Option<&FieldValue> {
self.fields.get(name)
}
}
impl Index<&str> for ListItem {
type Output = FieldValue;
fn index(&self, i: &str) -> &Self::Output {
self.fields.get(i).expect("Field doesn't exist.")
}
}
impl From<ListIterator> for ListItem {
fn from(list: ListIterator) -> Self {
let mut item = ListItem::new();
for name in list.get_field_names() {
item.add(name, list.get_field(name).unwrap());
}
item
}
}
impl From<&ListIterator> for ListItem {
fn from(list: &ListIterator) -> Self {
let mut item = ListItem::new();
for name in list.get_field_names() {
item.add(name, list.get_field(name).unwrap());
}
item
}
}