modio/util/download/
action.rs

1use crate::types::files::File;
2use crate::types::id::{FileId, GameId, ModId};
3use crate::types::mods::Mod;
4
5#[derive(Debug)]
6pub enum DownloadAction {
7    /// Download the primary modfile of a mod.
8    Primary { game_id: GameId, mod_id: ModId },
9    /// Download a specific modfile of a mod.
10    File {
11        game_id: GameId,
12        mod_id: ModId,
13        file_id: FileId,
14    },
15    /// Download a specific modfile.
16    FileObj(Box<File>),
17    /// Download a specific version of a mod.
18    Version {
19        game_id: GameId,
20        mod_id: ModId,
21        version: String,
22        policy: ResolvePolicy,
23    },
24}
25
26/// Defines the policy for `DownloadAction::Version` when multiple files are found.
27#[derive(Debug)]
28pub enum ResolvePolicy {
29    /// Download the latest file.
30    Latest,
31    /// Fail with [`ErrorKind::MultipleFilesFound`] as error kind.
32    ///
33    /// [`ErrorKind::MultipleFilesFound`]: super::ErrorKind::MultipleFilesFound
34    Fail,
35}
36
37/// Convert `Mod` to [`DownloadAction::File`] or [`DownloadAction::Primary`] if `Mod::modfile` is `None`
38impl From<Mod> for DownloadAction {
39    fn from(m: Mod) -> DownloadAction {
40        if let Some(file) = m.modfile {
41            DownloadAction::from(file)
42        } else {
43            DownloadAction::Primary {
44                game_id: m.game_id,
45                mod_id: m.id,
46            }
47        }
48    }
49}
50
51/// Convert `File` to [`DownloadAction::FileObj`]
52impl From<File> for DownloadAction {
53    fn from(file: File) -> DownloadAction {
54        DownloadAction::FileObj(Box::new(file))
55    }
56}
57
58/// Convert `(GameId, ModId)` to [`DownloadAction::Primary`]
59impl From<(GameId, ModId)> for DownloadAction {
60    fn from((game_id, mod_id): (GameId, ModId)) -> DownloadAction {
61        DownloadAction::Primary { game_id, mod_id }
62    }
63}
64
65/// Convert `(GameId, ModId, FileId)` to [`DownloadAction::File`]
66impl From<(GameId, ModId, FileId)> for DownloadAction {
67    fn from((game_id, mod_id, file_id): (GameId, ModId, FileId)) -> DownloadAction {
68        DownloadAction::File {
69            game_id,
70            mod_id,
71            file_id,
72        }
73    }
74}
75
76/// Convert `(GameId, ModId, String)` to [`DownloadAction::Version`] with resolve policy
77/// set to `ResolvePolicy::Latest`
78impl From<(GameId, ModId, String)> for DownloadAction {
79    fn from((game_id, mod_id, version): (GameId, ModId, String)) -> DownloadAction {
80        DownloadAction::Version {
81            game_id,
82            mod_id,
83            version,
84            policy: ResolvePolicy::Latest,
85        }
86    }
87}
88
89/// Convert `(GameId, ModId, &'a str)` to [`DownloadAction::Version`] with resolve policy
90/// set to `ResolvePolicy::Latest`
91impl<'a> From<(GameId, ModId, &'a str)> for DownloadAction {
92    fn from((game_id, mod_id, version): (GameId, ModId, &'a str)) -> DownloadAction {
93        DownloadAction::Version {
94            game_id,
95            mod_id,
96            version: version.to_string(),
97            policy: ResolvePolicy::Latest,
98        }
99    }
100}