use crate::types::files::File;
use crate::types::id::{FileId, GameId, ModId};
use crate::types::mods::Mod;
#[derive(Debug)]
pub enum DownloadAction {
Primary { game_id: GameId, mod_id: ModId },
File {
game_id: GameId,
mod_id: ModId,
file_id: FileId,
},
FileObj(Box<File>),
Version {
game_id: GameId,
mod_id: ModId,
version: String,
policy: ResolvePolicy,
},
}
#[derive(Debug)]
pub enum ResolvePolicy {
Latest,
Fail,
}
impl From<Mod> for DownloadAction {
fn from(m: Mod) -> DownloadAction {
if let Some(file) = m.modfile {
DownloadAction::from(file)
} else {
DownloadAction::Primary {
game_id: m.game_id,
mod_id: m.id,
}
}
}
}
impl From<File> for DownloadAction {
fn from(file: File) -> DownloadAction {
DownloadAction::FileObj(Box::new(file))
}
}
impl From<(GameId, ModId)> for DownloadAction {
fn from((game_id, mod_id): (GameId, ModId)) -> DownloadAction {
DownloadAction::Primary { game_id, mod_id }
}
}
impl From<(GameId, ModId, FileId)> for DownloadAction {
fn from((game_id, mod_id, file_id): (GameId, ModId, FileId)) -> DownloadAction {
DownloadAction::File {
game_id,
mod_id,
file_id,
}
}
}
impl From<(GameId, ModId, String)> for DownloadAction {
fn from((game_id, mod_id, version): (GameId, ModId, String)) -> DownloadAction {
DownloadAction::Version {
game_id,
mod_id,
version,
policy: ResolvePolicy::Latest,
}
}
}
impl<'a> From<(GameId, ModId, &'a str)> for DownloadAction {
fn from((game_id, mod_id, version): (GameId, ModId, &'a str)) -> DownloadAction {
DownloadAction::Version {
game_id,
mod_id,
version: version.to_string(),
policy: ResolvePolicy::Latest,
}
}
}