xref: /aosp_15_r20/external/uwb/src/rust/uwb_core/src/service/uwb_service_builder.rs (revision e0df40009cb5d71e642272d38ba1bb7ffccfce41)
1 // Copyright 2022, The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 //! This module defines the UwbServiceBuilder, the builder of the UwbService.
16 
17 use tokio::runtime::{Handle, Runtime};
18 
19 use crate::service::uwb_service::{UwbService, UwbServiceCallback, UwbServiceCallbackBuilder};
20 use crate::uci::uci_hal::UciHal;
21 use crate::uci::uci_logger::UciLoggerMode;
22 use crate::uci::uci_logger_factory::UciLoggerFactory;
23 use crate::uci::uci_manager::UciManagerImpl;
24 use crate::utils::consuming_builder_field;
25 
26 /// Create the default runtime for UwbService.
default_runtime() -> Option<Runtime>27 pub fn default_runtime() -> Option<Runtime> {
28     tokio::runtime::Builder::new_multi_thread().thread_name("UwbService").enable_all().build().ok()
29 }
30 
31 /// The builder of UwbService, used to keep the backward compatibility when adding new parameters
32 /// of creating a UwbService instance.
33 pub struct UwbServiceBuilder<B, C, U, L>
34 where
35     B: UwbServiceCallbackBuilder<C>,
36     C: UwbServiceCallback,
37     U: UciHal,
38     L: UciLoggerFactory,
39 {
40     runtime_handle: Option<Handle>,
41     callback_builder: Option<B>,
42     uci_hal: Option<U>,
43     uci_logger_factory: Option<L>,
44     uci_logger_mode: UciLoggerMode,
45     // Circuimvents unused parameter "C" error
46     phantom: std::marker::PhantomData<C>,
47 }
48 
49 impl<B, C, U, L> Default for UwbServiceBuilder<B, C, U, L>
50 where
51     B: UwbServiceCallbackBuilder<C>,
52     C: UwbServiceCallback,
53     U: UciHal,
54     L: UciLoggerFactory,
55 {
default() -> Self56     fn default() -> Self {
57         Self {
58             runtime_handle: None,
59             callback_builder: None,
60             uci_hal: None,
61             uci_logger_factory: None,
62             uci_logger_mode: UciLoggerMode::Disabled,
63             phantom: std::marker::PhantomData,
64         }
65     }
66 }
67 
68 impl<B, C, U, L> UwbServiceBuilder<B, C, U, L>
69 where
70     B: UwbServiceCallbackBuilder<C>,
71     C: UwbServiceCallback,
72     U: UciHal,
73     L: UciLoggerFactory,
74 {
75     /// Create a new builder.
new() -> Self76     pub fn new() -> Self {
77         Default::default()
78     }
79 
80     // Setter methods of each field.
81     consuming_builder_field!(runtime_handle, Handle, Some);
82     consuming_builder_field!(callback_builder, B, Some);
83     consuming_builder_field!(uci_hal, U, Some);
84     consuming_builder_field!(uci_logger_factory, L, Some);
85     consuming_builder_field!(uci_logger_mode, UciLoggerMode);
86 
87     /// Build the UwbService.
build(mut self) -> Option<UwbService>88     pub fn build(mut self) -> Option<UwbService> {
89         let runtime_handle = self.runtime_handle.take()?;
90         let uci_hal = self.uci_hal.take()?;
91         let mut uci_logger_factory = self.uci_logger_factory.take()?;
92         let uci_logger = uci_logger_factory.build_logger("default")?;
93         let uci_logger_mode = self.uci_logger_mode;
94         let uci_manager = runtime_handle
95             .block_on(async move { UciManagerImpl::new(uci_hal, uci_logger, uci_logger_mode) });
96         UwbService::new(runtime_handle, self.callback_builder.take()?, uci_manager)
97     }
98 }
99 
100 #[cfg(test)]
101 mod tests {
102     use super::*;
103     use crate::service::mock_uwb_service_callback::MockUwbServiceCallback;
104     use crate::service::uwb_service_callback_builder::UwbServiceCallbackSendBuilder;
105     use crate::uci::mock_uci_hal::MockUciHal;
106     use crate::uci::uci_logger_factory::NopUciLoggerFactory;
107 
108     #[test]
test_build_fail()109     fn test_build_fail() {
110         let result = UwbServiceBuilder::<
111             UwbServiceCallbackSendBuilder<MockUwbServiceCallback>,
112             MockUwbServiceCallback,
113             MockUciHal,
114             NopUciLoggerFactory,
115         >::new()
116         .build();
117         assert!(result.is_none());
118     }
119 
120     #[test]
test_build_ok()121     fn test_build_ok() {
122         let runtime = default_runtime().unwrap();
123         let callback = MockUwbServiceCallback::new();
124         let result = UwbServiceBuilder::new()
125             .runtime_handle(runtime.handle().to_owned())
126             .callback_builder(UwbServiceCallbackSendBuilder::new(callback))
127             .uci_hal(MockUciHal::new())
128             .uci_logger_factory(NopUciLoggerFactory::default())
129             .build();
130         assert!(result.is_some());
131     }
132 }
133