// Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. use std::sync::{Arc, OnceLock, RwLock}; use crate::captures::capture::Captures; use crate::version::get_version; static RESOURCES: OnceLock = OnceLock::new(); /// Resource struct includes all the global and possibly shared /// resources for netsim. Each field within Resource should be an Arc /// protected by a RwLock or Mutex. pub struct Resource { version: String, captures: Arc>, } impl Resource { pub fn new() -> Self { Self { version: get_version(), captures: Arc::new(RwLock::new(Captures::new())) } } #[allow(dead_code)] pub fn get_version_resource(self) -> String { self.version } } pub fn clone_captures() -> Arc> { Arc::clone(&RESOURCES.get_or_init(Resource::new).captures) } #[cfg(test)] mod tests { use super::*; #[test] fn test_version() { let resource = Resource::new(); assert_eq!(get_version(), resource.get_version_resource()); } }