lix-installer/src/planner/mod.rs

70 lines
2.4 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
2022-10-25 18:57:09 +00:00
use crate::{actions::ActionError, settings::InstallSettingsError, InstallPlan};
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-14 22:14:03 +00:00
pub fn default() -> Result<Self, PlannerError> {
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()?))
},
(Architecture::Aarch64(_), OperatingSystem::Linux) => {
Ok(Self::LinuxMulti(linux::LinuxMulti::default()?))
},
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()?))
},
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()?))
},
2022-10-14 22:14:03 +00:00
_ => Err(PlannerError::UnsupportedArchitecture(target_lexicon::HOST)),
}
}
2022-10-25 18:57:09 +00:00
pub async fn plan(self) -> Result<InstallPlan, PlannerError> {
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
}
}
}
#[async_trait::async_trait]
2022-10-25 18:57:09 +00:00
trait Plannable: Into<BuiltinPlanner>
2022-10-14 22:14:03 +00:00
where
Self: Sized,
{
const DISPLAY_STRING: &'static str;
const SLUG: &'static str;
2022-10-25 18:57:09 +00:00
fn default() -> Result<Self, PlannerError>;
async fn plan(self) -> Result<InstallPlan, PlannerError>;
2022-10-14 22:14:03 +00:00
}
#[derive(thiserror::Error, Debug)]
pub enum PlannerError {
#[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]
ActionError,
),
2022-10-25 18:57:09 +00:00
#[error(transparent)]
InstallSettings(#[from] InstallSettingsError),
2022-10-14 22:14:03 +00:00
}