Skip to main content

driver_manager_types/
node_types.rs

1// Copyright 2026 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 fidl_fuchsia_component_sandbox::DirConnector;
6use std::cell::RefCell;
7use std::fmt;
8use std::rc::Rc;
9use {fidl_fuchsia_component_decl as fdecl, fidl_fuchsia_driver_framework as fdf};
10
11#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)]
12#[repr(u8)]
13pub enum Collection {
14    None,
15    Boot,
16    Package,
17    FullPackage,
18}
19
20impl fmt::Display for Collection {
21    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
22        write!(
23            f,
24            "{}",
25            match self {
26                Collection::None => "none",
27                Collection::Boot => "boot-drivers",
28                Collection::Package => "base-drivers",
29                Collection::FullPackage => "full-drivers",
30            },
31        )
32    }
33}
34
35#[derive(PartialEq, Eq, Debug)]
36pub enum NodeType {
37    Normal,
38    Composite,
39}
40
41#[derive(PartialEq, Eq, Clone, Copy, Debug)]
42pub enum ShutdownState {
43    Running,
44    Prestop,
45    WaitingOnDriverBind,
46    WaitingOnChildren,
47    WaitingOnDriver,
48    WaitingOnDriverComponent,
49    Stopped,
50    WaitingOnDestroy,
51    Destroyed,
52}
53
54impl fmt::Display for ShutdownState {
55    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
56        write!(
57            f,
58            "{}",
59            match self {
60                ShutdownState::WaitingOnDriverBind => "waiting for driver to finish binding",
61                ShutdownState::Running => "in normal running state",
62                ShutdownState::Prestop => "in running state, but flagged for removal soon.",
63                ShutdownState::WaitingOnChildren => "waiting for children to complete shutdown",
64                // This message is load-bearing server-side as it's used to identify the hanging driver.
65                // Please notify //src/developer/forensics/OWNERS upon changing.
66                ShutdownState::WaitingOnDriver => {
67                    "waiting for driver's Stop() function and destructor finish running"
68                }
69                ShutdownState::WaitingOnDriverComponent =>
70                    "waiting for the driver component to stop",
71                ShutdownState::Stopped => "node component instance stop is completed",
72                ShutdownState::WaitingOnDestroy => "waiting for the component to be destroyed.",
73                ShutdownState::Destroyed => "node shutdown is completed",
74            },
75        )
76    }
77}
78
79#[derive(Clone, Debug)]
80pub enum OfferTransport {
81    DriverTransport,
82    ZirconTransport,
83    Dictionary,
84}
85
86#[derive(Clone, Debug)]
87pub struct NodeOffer {
88    pub source_name: String,
89    pub source_collection: Collection,
90    pub transport: OfferTransport,
91    pub service_name: String,
92    pub source_instance_filter: Vec<String>,
93    pub renamed_instances: Vec<fdecl::NameMapping>,
94    pub dir_connector: Rc<RefCell<Option<DirConnector>>>,
95}
96
97impl From<&NodeOffer> for fdf::Offer {
98    fn from(offer: &NodeOffer) -> Self {
99        let service_offer = fdecl::OfferService {
100            source: Some(fdecl::Ref::Child(fdecl::ChildRef {
101                name: offer.source_name.clone(),
102                collection: Some(offer.source_collection.to_string()),
103            })),
104            source_name: Some(offer.service_name.clone()),
105            target_name: Some(offer.service_name.clone()),
106            source_instance_filter: Some(offer.source_instance_filter.clone()),
107            renamed_instances: Some(offer.renamed_instances.clone()),
108            ..Default::default()
109        };
110        let inner_offer = fdecl::Offer::Service(service_offer);
111        match offer.transport {
112            crate::node_types::OfferTransport::ZirconTransport => {
113                fdf::Offer::ZirconTransport(inner_offer)
114            }
115            crate::node_types::OfferTransport::DriverTransport => {
116                fdf::Offer::DriverTransport(inner_offer)
117            }
118            crate::node_types::OfferTransport::Dictionary => {
119                fdf::Offer::DictionaryOffer(inner_offer)
120            }
121        }
122    }
123}