Skip to main content

fuchsia_inspect/writer/types/
bool_property.rs

1// Copyright 2021 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::writer::{Inner, InnerValueType, InspectType, Property};
6
7/// Inspect API Bool Property data type.
8///
9/// NOTE: do not rely on PartialEq implementation for true comparison.
10/// Instead leverage the reader.
11///
12/// NOTE: Operations on a Default value are no-ops.
13#[derive(Debug, PartialEq, Eq, Default)]
14pub struct BoolProperty {
15    inner: Inner<InnerValueType>,
16}
17
18impl Property<'_> for BoolProperty {
19    type Type = bool;
20
21    fn set(&self, value: bool) {
22        if let Some(ref inner_ref) = self.inner.inner_ref()
23            && let Ok(mut state) = inner_ref.state.try_lock()
24        {
25            state.set_bool(inner_ref.block_index, value);
26        }
27    }
28}
29
30impl InspectType for BoolProperty {
31    fn into_recorded(self) -> crate::writer::types::RecordedInspectType {
32        crate::writer::types::RecordedInspectType::BoolProperty(self)
33    }
34}
35
36crate::impl_inspect_type_internal!(BoolProperty);
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41    use crate::writer::Node;
42    use crate::writer::testing_utils::{GetBlockExt, get_state};
43    use inspect_format::{BlockType, Bool};
44
45    #[fuchsia::test]
46    fn bool_property() {
47        // Create and use a default value.
48        let default = BoolProperty::default();
49        default.set(true);
50
51        let state = get_state(4096);
52        let root = Node::new_root(state);
53        let node = root.create_child("node");
54        {
55            let property = node.create_bool("property", true);
56            property.get_block::<_, Bool>(|block| {
57                assert_eq!(block.block_type(), Some(BlockType::BoolValue));
58                assert!(block.value());
59            });
60            node.get_block::<_, inspect_format::Node>(|block| {
61                assert_eq!(block.child_count(), 1);
62            });
63
64            property.set(false);
65            property.get_block::<_, Bool>(|block| {
66                assert!(!block.value());
67            });
68        }
69        node.get_block::<_, inspect_format::Node>(|block| {
70            assert_eq!(block.child_count(), 0);
71        });
72    }
73}