detect_targets/
desired_targets.rs1use crate::detect_targets;
2
3use std::sync::Arc;
4
5use tokio::sync::SetOnce;
6
7#[derive(Debug)]
8enum DesiredTargetsInner {
9 AutoDetect(Arc<SetOnce<Vec<String>>>),
10 Initialized(Vec<String>),
11}
12
13#[derive(Debug)]
14pub struct DesiredTargets(DesiredTargetsInner);
15
16impl DesiredTargets {
17 fn initialized(targets: Vec<String>) -> Self {
18 Self(DesiredTargetsInner::Initialized(targets))
19 }
20
21 fn auto_detect() -> Self {
22 let arc = Arc::new(SetOnce::new());
23
24 let set_once = arc.clone();
25 tokio::spawn(async move {
26 set_once.set(detect_targets().await).unwrap();
27 });
28
29 Self(DesiredTargetsInner::AutoDetect(arc))
30 }
31
32 pub async fn get(&self) -> &[String] {
33 use DesiredTargetsInner::*;
34
35 match &self.0 {
36 Initialized(targets) => targets,
37 AutoDetect(set_once) => set_once.wait().await,
38 }
39 }
40
41 pub fn get_initialized(&self) -> Option<&[String]> {
44 use DesiredTargetsInner::*;
45
46 match &self.0 {
47 Initialized(targets) => Some(targets),
48 AutoDetect(..) => None,
49 }
50 }
51}
52
53pub fn get_desired_targets(opts_targets: Option<Vec<String>>) -> DesiredTargets {
60 if let Some(targets) = opts_targets {
61 DesiredTargets::initialized(targets)
62 } else {
63 DesiredTargets::auto_detect()
64 }
65}