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
|
|
|
|
2022-10-26 22:13:42 +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 {
|
2022-10-26 22:13:42 +00:00
|
|
|
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) => {
|
2022-10-26 16:27:50 +00:00
|
|
|
Ok(Self::LinuxMulti(linux::LinuxMulti::default().await?))
|
2022-10-25 18:57:09 +00:00
|
|
|
},
|
|
|
|
(Architecture::Aarch64(_), OperatingSystem::Linux) => {
|
2022-10-26 16:27:50 +00:00
|
|
|
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) => {
|
2022-10-26 16:27:50 +00:00
|
|
|
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) => {
|
2022-10-26 16:27:50 +00:00
|
|
|
Ok(Self::DarwinMulti(darwin::DarwinMulti::default().await?))
|
2022-10-25 18:57:09 +00:00
|
|
|
},
|
2022-10-26 22:13:42 +00:00
|
|
|
_ => Err(BuiltinPlannerError::UnsupportedArchitecture(target_lexicon::HOST).boxed()),
|
2022-10-14 22:14:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-26 22:13:42 +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)]
|
2022-10-26 21:14:53 +00:00
|
|
|
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]
|
2022-10-26 21:14:53 +00:00
|
|
|
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),
|
2022-10-26 16:27:50 +00:00
|
|
|
#[error(transparent)]
|
|
|
|
Plist(#[from] plist::Error),
|
2022-10-14 22:14:03 +00:00
|
|
|
}
|