lix-installer/src/planner/mod.rs

71 lines
2.7 KiB
Rust
Raw Normal View History

2022-10-25 18:57:09 +00:00
pub mod darwin;
pub mod linux;
pub mod specific;
2022-10-14 22:14:03 +00:00
use crate::{action::ActionError, settings::InstallSettingsError, InstallPlan};
#[async_trait::async_trait]
#[typetag::serde(tag = "planner")]
pub trait Planner: std::fmt::Debug + Send + Sync + dyn_clone::DynClone {
async fn default() -> Result<Self, Box<dyn std::error::Error + Sync + Send>>
where
Self: Sized;
async fn plan(self) -> Result<InstallPlan, Box<dyn std::error::Error + Sync + Send>>;
}
dyn_clone::clone_trait_object!(Planner);
2022-10-14 22:14:03 +00:00
2022-10-25 18:57:09 +00:00
#[derive(Debug, Clone, clap::Subcommand, serde::Serialize, serde::Deserialize)]
pub enum BuiltinPlanner {
LinuxMulti(linux::LinuxMulti),
DarwinMulti(darwin::DarwinMulti),
SteamDeck(specific::SteamDeck),
2022-10-14 22:14:03 +00:00
}
2022-10-25 18:57:09 +00:00
impl BuiltinPlanner {
pub async fn default() -> Result<Self, Box<dyn std::error::Error + Sync + Send>> {
2022-10-14 22:14:03 +00:00
use target_lexicon::{Architecture, OperatingSystem};
match (Architecture::host(), OperatingSystem::host()) {
2022-10-25 18:57:09 +00:00
(Architecture::X86_64, OperatingSystem::Linux) => {
Ok(Self::LinuxMulti(linux::LinuxMulti::default().await?))
2022-10-25 18:57:09 +00:00
},
(Architecture::Aarch64(_), OperatingSystem::Linux) => {
Ok(Self::LinuxMulti(linux::LinuxMulti::default().await?))
2022-10-25 18:57:09 +00:00
},
2022-10-24 23:16:18 +00:00
(Architecture::X86_64, OperatingSystem::MacOSX { .. })
2022-10-25 18:57:09 +00:00
| (Architecture::X86_64, OperatingSystem::Darwin) => {
Ok(Self::DarwinMulti(darwin::DarwinMulti::default().await?))
2022-10-25 18:57:09 +00:00
},
2022-10-24 23:16:18 +00:00
(Architecture::Aarch64(_), OperatingSystem::MacOSX { .. })
2022-10-25 18:57:09 +00:00
| (Architecture::Aarch64(_), OperatingSystem::Darwin) => {
Ok(Self::DarwinMulti(darwin::DarwinMulti::default().await?))
2022-10-25 18:57:09 +00:00
},
_ => Err(BuiltinPlannerError::UnsupportedArchitecture(target_lexicon::HOST).boxed()),
2022-10-14 22:14:03 +00:00
}
}
pub async fn plan(self) -> Result<InstallPlan, Box<dyn std::error::Error + Sync + Send>> {
2022-10-14 22:14:03 +00:00
match self {
2022-10-25 18:57:09 +00:00
BuiltinPlanner::LinuxMulti(planner) => planner.plan().await,
BuiltinPlanner::DarwinMulti(planner) => planner.plan().await,
BuiltinPlanner::SteamDeck(planner) => planner.plan().await,
2022-10-14 22:14:03 +00:00
}
}
}
#[derive(thiserror::Error, Debug)]
pub enum BuiltinPlannerError {
2022-10-14 22:14:03 +00:00
#[error("Harmonic does not have a default planner for the `{0}` architecture right now, pass a specific archetype")]
UnsupportedArchitecture(target_lexicon::Triple),
#[error("Error executing action")]
ActionError(
#[source]
#[from]
Box<dyn std::error::Error + Send + Sync>,
2022-10-14 22:14:03 +00:00
),
2022-10-25 18:57:09 +00:00
#[error(transparent)]
InstallSettings(#[from] InstallSettingsError),
#[error(transparent)]
Plist(#[from] plist::Error),
2022-10-14 22:14:03 +00:00
}