fuchsia_inspect/writer/types/
double_property.rs1use crate::writer::{Inner, InnerValueType, InspectType, NumericProperty, Property};
6use log::error;
7
8#[derive(Debug, PartialEq, Eq, Default)]
15pub struct DoubleProperty {
16 inner: Inner<InnerValueType>,
17}
18
19impl InspectType for DoubleProperty {
20 fn into_recorded(self) -> crate::writer::types::RecordedInspectType {
21 crate::writer::types::RecordedInspectType::DoubleProperty(self)
22 }
23}
24
25crate::impl_inspect_type_internal!(DoubleProperty);
26
27impl Property<'_> for DoubleProperty {
28 type Type = f64;
29
30 fn set(&self, value: f64) {
31 if let Some(ref inner_ref) = self.inner.inner_ref() {
32 match inner_ref.state.try_lock() {
33 Ok(mut state) => {
34 state.set_double_metric(inner_ref.block_index, value);
35 }
36 Err(err) => error!(err:?; "Failed to set property"),
37 }
38 }
39 }
40}
41
42impl NumericProperty<'_> for DoubleProperty {
43 fn add(&self, value: f64) -> Option<f64> {
44 if let Some(ref inner_ref) = self.inner.inner_ref() {
45 match inner_ref.state.try_lock() {
46 Ok(mut state) => {
47 return Some(state.add_double_metric(inner_ref.block_index, value));
48 }
49 Err(err) => error!(err:?; "Failed to add property"),
50 }
51 }
52 None
53 }
54
55 fn subtract(&self, value: f64) -> Option<f64> {
56 if let Some(ref inner_ref) = self.inner.inner_ref() {
57 match inner_ref.state.try_lock() {
58 Ok(mut state) => {
59 return Some(state.subtract_double_metric(inner_ref.block_index, value));
60 }
61 Err(err) => error!(err:?; "Failed to subtract property"),
62 }
63 }
64 None
65 }
66}
67
68#[cfg(test)]
69mod tests {
70 use super::*;
71 use crate::writer::Node;
72 use crate::writer::testing_utils::{GetBlockExt, get_state};
73 use inspect_format::{BlockType, Double};
74
75 #[fuchsia::test]
76 fn double_property() {
77 let default = DoubleProperty::default();
79 default.add(1.0);
80
81 let state = get_state(4096);
82 let root = Node::new_root(state);
83 let node = root.create_child("node");
84 {
85 let property = node.create_double("property", 1.0);
86 property.get_block::<_, Double>(|property_block| {
87 assert_eq!(property_block.block_type(), Some(BlockType::DoubleValue));
88 assert_eq!(property_block.value(), 1.0);
89 });
90 node.get_block::<_, inspect_format::Node>(|node_block| {
91 assert_eq!(node_block.child_count(), 1);
92 });
93
94 property.set(2.0);
95 property.get_block::<_, Double>(|property_block| {
96 assert_eq!(property_block.value(), 2.0);
97 });
98
99 assert_eq!(property.subtract(5.5).unwrap(), -3.5);
100 property.get_block::<_, Double>(|property_block| {
101 assert_eq!(property_block.value(), -3.5);
102 });
103
104 assert_eq!(property.add(8.1).unwrap(), 4.6);
105 property.get_block::<_, Double>(|property_block| {
106 assert_eq!(property_block.value(), 4.6);
107 });
108 }
109 node.get_block::<_, inspect_format::Node>(|node_block| {
110 assert_eq!(node_block.child_count(), 0);
111 });
112 }
113}