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