nushell/src/object/dict.rs

56 lines
1.4 KiB
Rust
Raw Normal View History

2019-05-10 18:59:12 +02:00
use crate::object::desc::DataDescriptor;
use crate::object::{Primitive, Value};
use crate::prelude::*;
2019-05-10 18:59:12 +02:00
use crate::MaybeOwned;
use derive_new::new;
use indexmap::IndexMap;
2019-05-10 18:59:12 +02:00
use std::cell::RefCell;
use std::rc::Rc;
#[derive(Debug, Default)]
pub struct Dictionary {
entries: IndexMap<String, Value>,
2019-05-10 18:59:12 +02:00
}
impl Dictionary {
crate fn add(&mut self, name: impl Into<String>, value: Value) {
self.entries.insert(name.into(), value);
}
crate fn copy_dict(&self) -> Dictionary {
let mut out = Dictionary::default();
2019-05-10 18:59:12 +02:00
for (key, value) in self.entries.iter() {
out.add(key.clone(), value.copy());
2019-05-10 18:59:12 +02:00
}
out
2019-05-10 18:59:12 +02:00
}
}
impl crate::object::ShellObject for Dictionary {
2019-05-10 18:59:12 +02:00
fn to_shell_string(&self) -> String {
format!("[object Object] lol")
}
fn data_descriptors(&self) -> Vec<DataDescriptor> {
self.entries
.iter()
.map(|(name, value)| {
2019-05-15 18:12:38 +02:00
DataDescriptor::new(name.clone(), true, Box::new(crate::object::types::AnyShell))
2019-05-10 18:59:12 +02:00
})
.collect()
}
fn get_data(&'a self, desc: &DataDescriptor) -> MaybeOwned<'a, Value> {
match self.entries.get(&desc.name) {
Some(v) => MaybeOwned::Borrowed(v),
2019-05-10 18:59:12 +02:00
None => MaybeOwned::Owned(Value::Primitive(Primitive::Nothing)),
}
}
fn copy(&self) -> Value {
Value::Object(Box::new(self.copy_dict()))
}
2019-05-10 18:59:12 +02:00
}