fuchsia_inspect/writer/types/
lazy_node.rs1use crate::writer::{Error, Inner, InnerType, InspectType, State};
6use inspect_format::BlockIndex;
7
8#[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}