use std::fmt::Display;
use crate::{
dev::{
certificates::DevelopmentCertificate, developer_session::DeveloperSession,
teams::DeveloperTeam,
},
sideload::sideloader::Sideloader,
util::storage::SideloadingStorage,
};
#[derive(Clone)]
pub enum TeamSelection {
First,
PromptOnce(fn(&Vec<DeveloperTeam>) -> Option<String>),
PromptAlways(fn(&Vec<DeveloperTeam>) -> Option<String>),
}
impl Display for TeamSelection {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
TeamSelection::First => write!(f, "first team"),
TeamSelection::PromptOnce(_) => write!(f, "prompting for team (once)"),
TeamSelection::PromptAlways(_) => write!(f, "prompting for team (always)"),
}
}
}
pub enum MaxCertsBehavior {
Revoke,
Error,
Prompt(Box<dyn Fn(&Vec<DevelopmentCertificate>) -> Option<Vec<String>> + Send + Sync>),
}
pub enum ExtensionsBehaviorChoice {
ReuseMain,
RegisterAll,
RemoveExtensions,
}
pub struct SideloaderBuilder {
developer_session: DeveloperSession,
apple_email: String,
team_selection: Option<TeamSelection>,
max_certs_behavior: Option<MaxCertsBehavior>,
storage: Option<Box<dyn SideloadingStorage>>,
machine_name: Option<String>,
delete_app_after_install: bool,
}
impl SideloaderBuilder {
pub fn new(developer_session: DeveloperSession, apple_email: String) -> Self {
SideloaderBuilder {
team_selection: None,
storage: None,
developer_session,
machine_name: None,
apple_email,
max_certs_behavior: None,
delete_app_after_install: true,
}
}
pub fn team_selection(mut self, selection: TeamSelection) -> Self {
self.team_selection = Some(selection);
self
}
pub fn storage(mut self, storage: Box<dyn SideloadingStorage>) -> Self {
self.storage = Some(storage);
self
}
pub fn machine_name(mut self, machine_name: String) -> Self {
self.machine_name = Some(machine_name);
self
}
pub fn max_certs_behavior(mut self, behavior: MaxCertsBehavior) -> Self {
self.max_certs_behavior = Some(behavior);
self
}
pub fn delete_app_after_install(mut self, delete: bool) -> Self {
self.delete_app_after_install = delete;
self
}
pub fn build(self) -> Sideloader {
Sideloader::new(
self.developer_session,
self.apple_email,
self.team_selection.unwrap_or(TeamSelection::First),
self.max_certs_behavior.unwrap_or(MaxCertsBehavior::Error),
self.machine_name.unwrap_or_else(|| "isideload".to_string()),
self.storage
.unwrap_or_else(|| Box::new(crate::util::storage::new_storage())),
self.delete_app_after_install,
)
}
}