Skip to main content

routing/bedrock/
request_metadata.rs

1// Copyright 2024 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::rights::Rights;
6use crate::subdir::SubDir;
7use cm_rust::{CapabilityTypeName, EventScope, NativeIntoFidl};
8use fidl_fuchsia_component_runtime::RouteRequest;
9use fidl_fuchsia_io as fio;
10use moniker::Moniker;
11
12/// Returns a `RouteRequest` specifying a Protocol build type.
13pub fn protocol_metadata(availability: cm_types::Availability) -> RouteRequest {
14    RouteRequest {
15        build_type_name: Some(CapabilityTypeName::Protocol.to_string()),
16        availability: Some(availability.native_into_fidl()),
17        ..Default::default()
18    }
19}
20
21/// Returns a `RouteRequest` specifying a Dictionary build type.
22pub fn dictionary_metadata(availability: cm_types::Availability) -> RouteRequest {
23    RouteRequest {
24        build_type_name: Some(CapabilityTypeName::Dictionary.to_string()),
25        availability: Some(availability.native_into_fidl()),
26        ..Default::default()
27    }
28}
29
30/// Returns a `RouteRequest` specifying a Directory build type.
31pub fn directory_metadata(
32    availability: cm_types::Availability,
33    rights: Option<Rights>,
34    subdir: Option<SubDir>,
35) -> RouteRequest {
36    RouteRequest {
37        build_type_name: Some(CapabilityTypeName::Directory.to_string()),
38        availability: Some(availability.native_into_fidl()),
39        sub_directory_path: subdir.map(|sd| sd.as_ref().clone().native_into_fidl()),
40        directory_rights: rights.map(Into::into),
41        inherit_rights: Some(rights.is_none()),
42        ..Default::default()
43    }
44}
45
46/// Returns a `RouteRequest` specifying a Config build type.
47pub fn config_metadata(availability: cm_types::Availability) -> RouteRequest {
48    RouteRequest {
49        build_type_name: Some(CapabilityTypeName::Config.to_string()),
50        availability: Some(availability.native_into_fidl()),
51        ..Default::default()
52    }
53}
54
55/// Returns a `RouteRequest` specifying a Runner build type.
56pub fn runner_metadata(availability: cm_types::Availability) -> RouteRequest {
57    RouteRequest {
58        build_type_name: Some(CapabilityTypeName::Runner.to_string()),
59        availability: Some(availability.native_into_fidl()),
60        ..Default::default()
61    }
62}
63
64/// Returns a `RouteRequest` specifying a Resolver build type.
65pub fn resolver_metadata(availability: cm_types::Availability) -> RouteRequest {
66    RouteRequest {
67        build_type_name: Some(CapabilityTypeName::Resolver.to_string()),
68        availability: Some(availability.native_into_fidl()),
69        ..Default::default()
70    }
71}
72
73/// Returns a `RouteRequest` specifying a Service build type.
74pub fn service_metadata(availability: cm_types::Availability) -> RouteRequest {
75    RouteRequest {
76        build_type_name: Some(CapabilityTypeName::Service.to_string()),
77        availability: Some(availability.native_into_fidl()),
78        // Service capabilities are implemented as DirConnectors. When the Router<DirConnector>
79        // that connects to a component's outgoing directory wants to assemble a DirConnector, it
80        // pulls the set of rights that are allowed for that DirConnector from the route metadata.
81        // This gives us two choices: maintain a different Router<DirConnector> exclusively for
82        // connecting service capabilities to an outgoing directory that hard-codes R_STAR_DIR, or
83        // set R_STAR_DIR in the routing metadata and let the existing Router<DirConnector> use
84        // that information.
85        //
86        // It's less code duplication to do the latter, so we set the necessary bits to carry
87        // rights information in the routing metadata for service capability routing.
88        directory_rights: Some(fio::PERM_READABLE),
89        inherit_rights: Some(true),
90        ..Default::default()
91    }
92}
93
94/// Returns a `RouteRequest` specifying an EventStream build type.
95pub fn event_stream_metadata(
96    availability: cm_types::Availability,
97    route_metadata: Option<(Moniker, Box<[EventScope]>)>,
98) -> RouteRequest {
99    let (scope_moniker, scope) = match route_metadata {
100        Some((moniker, scope)) => (Some(moniker), Some(scope)),
101        None => (None, None),
102    };
103    RouteRequest {
104        build_type_name: Some(CapabilityTypeName::EventStream.to_string()),
105        availability: Some(availability.native_into_fidl()),
106        event_stream_scope_moniker: scope_moniker.map(NativeIntoFidl::native_into_fidl),
107        event_stream_scope: scope.map(NativeIntoFidl::native_into_fidl),
108        ..Default::default()
109    }
110}
111
112/// Returns a `RouteRequest` specifying a Storage build type.
113pub fn storage_metadata(availability: cm_types::Availability) -> RouteRequest {
114    RouteRequest {
115        build_type_name: Some(CapabilityTypeName::Storage.to_string()),
116        availability: Some(availability.native_into_fidl()),
117        directory_rights: Some(fio::PERM_READABLE | fio::PERM_WRITABLE),
118        inherit_rights: Some(false),
119        ..Default::default()
120    }
121}