Skip to main content

fuchsia_inspect/writer/types/
lazy_node.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::{Error, Inner, InnerType, InspectType, State};
6use inspect_format::BlockIndex;
7
8/// Inspect Lazy Node data type.
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 LazyNode {
15    inner: Inner<InnerLazyNodeType>,
16}
17
18impl InspectType for LazyNode {
19    fn into_recorded(self) -> crate::writer::types::RecordedInspectType {
20        crate::writer::types::RecordedInspectType::LazyNode(self)
21    }
22}
23
24crate::impl_inspect_type_internal!(LazyNode);
25
26#[derive(Default, Debug)]
27struct InnerLazyNodeType;
28
29impl InnerType for InnerLazyNodeType {
30    type Data = ();
31    fn free(state: &State, _: &Self::Data, block_index: BlockIndex) -> Result<(), Error> {
32        let mut state_lock = state.try_lock()?;
33        state_lock
34            .free_lazy_node(block_index)
35            .map_err(|err| Error::free("lazy node", block_index, err))
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use crate::writer::testing_utils::GetBlockExt;
42    use crate::writer::types::Inspector;
43    use futures::FutureExt;
44    use inspect_format::{BlockType, Link, LinkNodeDisposition};
45
46    #[fuchsia::test]
47    fn lazy_values() {
48        let inspector = Inspector::default();
49        let node = inspector.root().create_child("node");
50        {
51            let lazy_node =
52                node.create_lazy_values("lazy", || async move { Ok(Inspector::default()) }.boxed());
53            lazy_node.get_block::<_, Link>(|lazy_node_block| {
54                assert_eq!(lazy_node_block.block_type(), Some(BlockType::LinkValue));
55                assert_eq!(
56                    lazy_node_block.link_node_disposition(),
57                    Some(LinkNodeDisposition::Inline)
58                );
59                assert_eq!(*lazy_node_block.content_index(), 6);
60            });
61            node.get_block::<_, inspect_format::Node>(|node_block| {
62                assert_eq!(node_block.child_count(), 1);
63            });
64        }
65        node.get_block::<_, inspect_format::Node>(|node_block| {
66            assert_eq!(node_block.child_count(), 0);
67        });
68    }
69
70    #[fuchsia::test]
71    fn lazy_node() {
72        let inspector = Inspector::default();
73        let node = inspector.root().create_child("node");
74        {
75            let lazy_node =
76                node.create_lazy_child("lazy", || async move { Ok(Inspector::default()) }.boxed());
77            lazy_node.get_block::<_, Link>(|lazy_node_block| {
78                assert_eq!(lazy_node_block.block_type(), Some(BlockType::LinkValue));
79                assert_eq!(
80                    lazy_node_block.link_node_disposition(),
81                    Some(LinkNodeDisposition::Child)
82                );
83                assert_eq!(*lazy_node_block.content_index(), 6);
84            });
85            node.get_block::<_, inspect_format::Node>(|node_block| {
86                assert_eq!(node_block.child_count(), 1);
87            });
88        }
89        node.get_block::<_, inspect_format::Node>(|node_block| {
90            assert_eq!(node_block.child_count(), 0);
91        });
92    }
93}