1use fidl::endpoints::ClientEnd;
6use fidl_fuchsia_driver_framework::{
7 NodeAddArgs, NodeControllerMarker, NodeMarker, NodeProperty2, NodeProxy, Offer,
8};
9use log::error;
10use zx::Status;
11
12mod offers;
13mod properties;
14
15pub use offers::*;
16pub use properties::*;
17
18pub struct Node(NodeProxy);
20
21impl Node {
22 pub async fn add_owned_child(
31 &self,
32 args: NodeAddArgs,
33 ) -> Result<(ClientEnd<NodeMarker>, ClientEnd<NodeControllerMarker>), Status> {
34 let (child_controller, child_controller_server) = fidl::endpoints::create_endpoints();
35 let (child_node, child_node_server) = fidl::endpoints::create_endpoints();
36 self.proxy()
37 .add_child(args, child_controller_server, Some(child_node_server))
38 .await
39 .map_err(|err| {
40 error!("transport error trying to create child node: {err}");
41 Status::INTERNAL
42 })?
43 .map_err(|err| {
44 error!("failed to create child node: {err:?}");
45 Status::INTERNAL
46 })?;
47 Ok((child_node, child_controller))
48 }
49
50 pub async fn add_child(
59 &self,
60 args: NodeAddArgs,
61 ) -> Result<ClientEnd<NodeControllerMarker>, Status> {
62 let (child_controller, child_controller_server) = fidl::endpoints::create_endpoints();
63 self.proxy()
64 .add_child(args, child_controller_server, None)
65 .await
66 .map_err(|err| {
67 error!("transport error trying to create child node: {err}");
68 Status::INTERNAL
69 })?
70 .map_err(|err| {
71 error!("failed to create child node: {err:?}");
72 Status::INTERNAL
73 })?;
74 Ok(child_controller)
75 }
76
77 pub fn proxy(&self) -> &NodeProxy {
79 &self.0
80 }
81}
82
83impl From<NodeProxy> for Node {
84 fn from(value: NodeProxy) -> Self {
85 Node(value)
86 }
87}
88
89pub struct NodeBuilder(NodeAddArgs);
91
92impl NodeBuilder {
93 pub fn new(node_name: impl Into<String>) -> Self {
95 Self(NodeAddArgs { name: Some(node_name.into()), ..Default::default() })
96 }
97
98 pub fn add_property(mut self, key: impl Into<String>, value: impl Into<PropertyValue>) -> Self {
103 let key = key.into();
104 let value = value.into().0;
105 self.0.properties2.get_or_insert_with(|| vec![]).push(NodeProperty2 { key, value });
106 self
107 }
108
109 pub fn add_offer(mut self, offer: Offer) -> Self {
112 self.0.offers2.get_or_insert_with(|| vec![]).push(offer);
113 self
114 }
115
116 pub fn pipe_if<F>(self, condition: bool, callback: F) -> Self
118 where
119 F: FnOnce(Self) -> Self,
120 {
121 if condition {
122 callback(self)
123 } else {
124 self
125 }
126 }
127
128 pub fn pipe_opt<T, F>(self, value: Option<T>, callback: F) -> Self
130 where
131 F: FnOnce(Self, T) -> Self,
132 {
133 if let Some(value) = value {
134 callback(self, value)
135 } else {
136 self
137 }
138 }
139
140 pub fn build(self) -> NodeAddArgs {
143 self.0
144 }
145}