Compare commits

...

4 commits

Author SHA1 Message Date
344dc0c7e7
model/project: simplify file selection sorting logic
Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I0acf8e690157f1926a2658165592199d6a6a6964
2026-02-27 22:26:44 +03:00
4eb2d8d092
model/lockfile. one less clone!
Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I8dbfc511fc07273a69953b03404efc656a6a6964
2026-02-27 22:26:43 +03:00
14264931dd
model/enums: derive Ord for ReleaseType to simplify comparisons
Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Id47e4e40e015b1212815addbbca238456a6a6964
2026-02-27 22:26:42 +03:00
f70e3b8690
cli/commands: use constants for repeated platform names
Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I33c2cb59c73791a16f322e8544161a496a6a6964
2026-02-27 22:26:41 +03:00
4 changed files with 20 additions and 20 deletions

View file

@ -13,15 +13,18 @@ fn get_loaders(lockfile: &LockFile) -> Vec<String> {
pub fn create_all_platforms() pub fn create_all_platforms()
-> Result<HashMap<String, Box<dyn crate::platform::PlatformClient>>> { -> Result<HashMap<String, Box<dyn crate::platform::PlatformClient>>> {
const MODRINTH: &str = "modrinth";
const CURSEFORGE: &str = "curseforge";
let mut platforms = HashMap::new(); let mut platforms = HashMap::new();
if let Ok(platform) = create_platform("modrinth", None) { if let Ok(platform) = create_platform(MODRINTH, None) {
platforms.insert("modrinth".to_string(), platform); platforms.insert(MODRINTH.to_owned(), platform);
} }
if let Ok(platform) = if let Ok(platform) =
create_platform("curseforge", std::env::var("CURSEFORGE_API_KEY").ok()) create_platform(CURSEFORGE, std::env::var("CURSEFORGE_API_KEY").ok())
{ {
platforms.insert("curseforge".to_string(), platform); platforms.insert(CURSEFORGE.to_owned(), platform);
} }
Ok(platforms) Ok(platforms)

View file

@ -103,9 +103,13 @@ impl std::fmt::Display for UpdateStrategy {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[derive(
Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize,
)]
#[serde(rename_all = "lowercase")] #[serde(rename_all = "lowercase")]
pub enum ReleaseType { pub enum ReleaseType {
// Order matters: Release < Beta < Alpha for sorting (we want Release first)
// But we want reverse order, so we'll use reverse() or handle in comparison
Release, Release,
Beta, Beta,
Alpha, Alpha,

View file

@ -20,13 +20,15 @@ mod tests {
let mut id_map = HashMap::new(); let mut id_map = HashMap::new();
id_map.insert("modrinth".to_string(), pakku_id.to_string()); id_map.insert("modrinth".to_string(), pakku_id.to_string());
let slug_map = name_map.clone();
Project { Project {
pakku_id: Some(pakku_id.to_string()), pakku_id: Some(pakku_id.to_string()),
pakku_links: HashSet::new(), pakku_links: HashSet::new(),
r#type: ProjectType::Mod, r#type: ProjectType::Mod,
side: ProjectSide::Both, side: ProjectSide::Both,
slug: name_map.clone(), slug: slug_map,
name: name_map.clone(), name: name_map,
id: id_map, id: id_map,
update_strategy: UpdateStrategy::Latest, update_strategy: UpdateStrategy::Latest,
redistributable: true, redistributable: true,

View file

@ -261,20 +261,11 @@ impl Project {
))); )));
} }
// Sort by release type (release > beta > alpha) and date // Sort by release type (Release < Beta < Alpha) and date (newest first)
let mut sorted_files = compatible_files.clone(); let mut sorted_files = compatible_files.to_vec();
sorted_files.sort_by(|a, b| { sorted_files.sort_by(|a, b| {
use super::enums::ReleaseType; a.release_type
let type_order = |rt: &ReleaseType| { .cmp(&b.release_type)
match rt {
ReleaseType::Release => 0,
ReleaseType::Beta => 1,
ReleaseType::Alpha => 2,
}
};
type_order(&a.release_type)
.cmp(&type_order(&b.release_type))
.then_with(|| b.date_published.cmp(&a.date_published)) .then_with(|| b.date_published.cmp(&a.date_published))
}); });