mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-05-03 02:30:02 +00:00
Refactor: Extract new crate detect-targets
and improve code quality (#307)
* Refactor: Extract new crate `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Refactor: Extract new mod `detect` for `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Refactor: Extract `desired_targets` in crate `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Refactor: Extract `detect::linux` in crate `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Refactor: Extract `detect::macos` in crate `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Refactor: Extract `detect::windows` in crate `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Add new dep cfg-if v1.0.0 for `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Refactor: Simplify mod declaration in `detect` using `cfg_if!` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Refactor: Simplify `detect_targets` using `cfg_if!` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Add crate doc for `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Enable feature "macros" of tokio in `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Enable feature "io-util" of dep tokio Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Rm unused feature "io-util" & "macros" of dep tokio Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Set stdin & stderr to null in `get_target_from_rustc` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Improve doc of `get_desired_targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Improve `detect_targets_linux`: Run `ldd` with stdin set to null Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Fix potential panic in `windows::detect_alternative_targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * FIx fmt of `detect_targets_linux` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Do not re-export dep `detect-targets` in `crates/lib` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Fix typo in crate doc for `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Enable feature "macros" of tokio in dev mode Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Add example to crate doc of `detect-targets` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> * Improve API `get_desired_targets`: Take `Option<&str>` instead of `&Option<String>` Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com> Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
1102284684
commit
62f9450d2d
20 changed files with 574 additions and 263 deletions
59
crates/detect-targets/src/desired_targets.rs
Normal file
59
crates/detect-targets/src/desired_targets.rs
Normal file
|
@ -0,0 +1,59 @@
|
|||
use crate::detect_targets;
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use tokio::sync::OnceCell;
|
||||
|
||||
#[derive(Debug)]
|
||||
enum DesiredTargetsInner {
|
||||
AutoDetect(Arc<OnceCell<Vec<String>>>),
|
||||
Initialized(Vec<String>),
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct DesiredTargets(DesiredTargetsInner);
|
||||
|
||||
impl DesiredTargets {
|
||||
fn initialized(targets: Vec<String>) -> Self {
|
||||
Self(DesiredTargetsInner::Initialized(targets))
|
||||
}
|
||||
|
||||
fn auto_detect() -> Self {
|
||||
let arc = Arc::new(OnceCell::new());
|
||||
|
||||
let once_cell = arc.clone();
|
||||
tokio::spawn(async move {
|
||||
once_cell.get_or_init(detect_targets).await;
|
||||
});
|
||||
|
||||
Self(DesiredTargetsInner::AutoDetect(arc))
|
||||
}
|
||||
|
||||
pub async fn get(&self) -> &[String] {
|
||||
use DesiredTargetsInner::*;
|
||||
|
||||
match &self.0 {
|
||||
Initialized(targets) => targets,
|
||||
|
||||
// This will mostly just wait for the spawned task,
|
||||
// on rare occausion though, it will poll the future
|
||||
// returned by `detect_targets`.
|
||||
AutoDetect(once_cell) => once_cell.get_or_init(detect_targets).await,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// If opts_targets is `Some`, then it will be parsed in the format of
|
||||
/// `$target1,$target2,...`.
|
||||
/// Otherwise, call `detect_targets` using `tokio::spawn` to detect targets.
|
||||
///
|
||||
/// Since `detect_targets` internally spawns a process and wait for it,
|
||||
/// it's pretty costy, it is recommended to run this fn ASAP and
|
||||
/// reuse the result.
|
||||
pub fn get_desired_targets(opts_targets: Option<&str>) -> DesiredTargets {
|
||||
if let Some(targets) = opts_targets {
|
||||
DesiredTargets::initialized(targets.split(',').map(|t| t.to_string()).collect())
|
||||
} else {
|
||||
DesiredTargets::auto_detect()
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue