use crate::cypher::record::NamedRecord;
use crate::cypher::record_v2::{Record as SlotRecord, RecordSchema};
use crate::types::Value;
pub trait RecordView {
fn get(&self, name: &str) -> Option<&Value>;
fn for_each_field(&self, f: &mut dyn FnMut(&str, &Value));
}
impl RecordView for NamedRecord {
fn get(&self, name: &str) -> Option<&Value> {
self.fields.get(name)
}
fn for_each_field(&self, f: &mut dyn FnMut(&str, &Value)) {
for (k, v) in &self.fields {
f(k.as_str(), v);
}
}
}
#[derive(Clone, Copy)]
pub struct SlotView<'a> {
schema: &'a RecordSchema,
rec: &'a SlotRecord,
}
impl<'a> SlotView<'a> {
pub fn new(schema: &'a RecordSchema, rec: &'a SlotRecord) -> Self {
Self { schema, rec }
}
}
impl<'a> RecordView for SlotView<'a> {
fn get(&self, name: &str) -> Option<&Value> {
self.schema.slot(name).map(|s| self.rec.get(s))
}
fn for_each_field(&self, f: &mut dyn FnMut(&str, &Value)) {
for (slot, name) in self.schema.iter() {
f(name, self.rec.get(slot));
}
}
}
pub fn view_to_named(view: &dyn RecordView) -> NamedRecord {
let mut out = NamedRecord::new();
view.for_each_field(&mut |k, v| {
out.set(k.to_string(), v.clone());
});
out
}