use crate::writer::types::InspectType;
use derivative::Derivative;
use fuchsia_sync::Mutex;
type InspectTypeList = Vec<Box<dyn InspectType>>;
#[derive(Derivative)]
#[derivative(Debug, PartialEq, Eq)]
pub struct ValueList {
#[derivative(PartialEq = "ignore")]
#[derivative(Debug = "ignore")]
values: Mutex<Option<InspectTypeList>>,
}
impl Default for ValueList {
fn default() -> Self {
ValueList::new()
}
}
impl ValueList {
pub fn new() -> Self {
Self { values: Mutex::new(None) }
}
pub fn record(&self, value: impl InspectType + 'static) {
let boxed_value = Box::new(value);
let mut values_lock = self.values.lock();
if let Some(ref mut values) = *values_lock {
values.push(boxed_value);
} else {
*values_lock = Some(vec![boxed_value]);
}
}
pub fn clear(&self) {
let mut values_lock = self.values.lock();
*values_lock = None;
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::writer::types::Inspector;
use diagnostics_assertions::assert_json_diff;
#[fuchsia::test]
fn value_list_record() {
let inspector = Inspector::default();
let child = inspector.root().create_child("test");
let value_list = ValueList::new();
assert!(value_list.values.lock().is_none());
value_list.record(child);
assert_eq!(value_list.values.lock().as_ref().unwrap().len(), 1);
}
#[fuchsia::test]
fn value_list_drop_recorded() {
let inspector = Inspector::default();
let child = inspector.root().create_child("test");
let value_list = ValueList::new();
assert!(value_list.values.lock().is_none());
value_list.record(child);
assert_eq!(value_list.values.lock().as_ref().unwrap().len(), 1);
assert_json_diff!(inspector, root: {
test: {},
});
value_list.clear();
assert!(value_list.values.lock().is_none());
assert_json_diff!(inspector, root: {});
}
}