1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2023 Google LLC
2*cf78ab8cSAndroid Build Coastguard Worker //
3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*cf78ab8cSAndroid Build Coastguard Worker //
7*cf78ab8cSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*cf78ab8cSAndroid Build Coastguard Worker //
9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License.
14*cf78ab8cSAndroid Build Coastguard Worker
15*cf78ab8cSAndroid Build Coastguard Worker use std::sync::{Arc, OnceLock, RwLock};
16*cf78ab8cSAndroid Build Coastguard Worker
17*cf78ab8cSAndroid Build Coastguard Worker use crate::captures::capture::Captures;
18*cf78ab8cSAndroid Build Coastguard Worker use crate::version::get_version;
19*cf78ab8cSAndroid Build Coastguard Worker
20*cf78ab8cSAndroid Build Coastguard Worker static RESOURCES: OnceLock<Resource> = OnceLock::new();
21*cf78ab8cSAndroid Build Coastguard Worker
22*cf78ab8cSAndroid Build Coastguard Worker /// Resource struct includes all the global and possibly shared
23*cf78ab8cSAndroid Build Coastguard Worker /// resources for netsim. Each field within Resource should be an Arc
24*cf78ab8cSAndroid Build Coastguard Worker /// protected by a RwLock or Mutex.
25*cf78ab8cSAndroid Build Coastguard Worker pub struct Resource {
26*cf78ab8cSAndroid Build Coastguard Worker version: String,
27*cf78ab8cSAndroid Build Coastguard Worker captures: Arc<RwLock<Captures>>,
28*cf78ab8cSAndroid Build Coastguard Worker }
29*cf78ab8cSAndroid Build Coastguard Worker
30*cf78ab8cSAndroid Build Coastguard Worker impl Resource {
new() -> Self31*cf78ab8cSAndroid Build Coastguard Worker pub fn new() -> Self {
32*cf78ab8cSAndroid Build Coastguard Worker Self { version: get_version(), captures: Arc::new(RwLock::new(Captures::new())) }
33*cf78ab8cSAndroid Build Coastguard Worker }
34*cf78ab8cSAndroid Build Coastguard Worker
35*cf78ab8cSAndroid Build Coastguard Worker #[allow(dead_code)]
get_version_resource(self) -> String36*cf78ab8cSAndroid Build Coastguard Worker pub fn get_version_resource(self) -> String {
37*cf78ab8cSAndroid Build Coastguard Worker self.version
38*cf78ab8cSAndroid Build Coastguard Worker }
39*cf78ab8cSAndroid Build Coastguard Worker }
40*cf78ab8cSAndroid Build Coastguard Worker
clone_captures() -> Arc<RwLock<Captures>>41*cf78ab8cSAndroid Build Coastguard Worker pub fn clone_captures() -> Arc<RwLock<Captures>> {
42*cf78ab8cSAndroid Build Coastguard Worker Arc::clone(&RESOURCES.get_or_init(Resource::new).captures)
43*cf78ab8cSAndroid Build Coastguard Worker }
44*cf78ab8cSAndroid Build Coastguard Worker
45*cf78ab8cSAndroid Build Coastguard Worker #[cfg(test)]
46*cf78ab8cSAndroid Build Coastguard Worker mod tests {
47*cf78ab8cSAndroid Build Coastguard Worker use super::*;
48*cf78ab8cSAndroid Build Coastguard Worker
49*cf78ab8cSAndroid Build Coastguard Worker #[test]
test_version()50*cf78ab8cSAndroid Build Coastguard Worker fn test_version() {
51*cf78ab8cSAndroid Build Coastguard Worker let resource = Resource::new();
52*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(get_version(), resource.get_version_resource());
53*cf78ab8cSAndroid Build Coastguard Worker }
54*cf78ab8cSAndroid Build Coastguard Worker }
55