Skip to main content

modde_games/stardew/
scanner.rs

1//! Mod scanner for Stardew Valley (SMAPI mods).
2
3use anyhow::Result;
4
5use crate::scanner_patterns::DirectoryModRule;
6use crate::traits::{DiscoveredMod, ModScanner, ScanContext};
7
8/// [`ModScanner`] that discovers installed SMAPI mods.
9pub struct StardewScanner;
10
11pub static STARDEW_SCANNER: StardewScanner = StardewScanner;
12
13impl ModScanner for StardewScanner {
14    fn scan_directories(&self) -> &[&str] {
15        &["Mods"]
16    }
17
18    fn scan_filesystem(&self, ctx: &ScanContext<'_>) -> Result<Vec<DiscoveredMod>> {
19        let mut out = Vec::new();
20        DirectoryModRule {
21            rel_dir: "Mods",
22            mod_id_prefix: "smapi",
23            source_location: "Mods",
24            confidence: 0.75,
25            marker_file: Some("manifest.json"),
26            marker_confidence: Some(0.98),
27        }
28        .scan(ctx.install_dir, &mut out)?;
29        Ok(out)
30    }
31
32    fn mod_id_footprint(&self, mod_id: &str) -> Option<modde_core::scanner::ModFootprint> {
33        let name = mod_id.strip_prefix("smapi/")?.to_lowercase();
34        Some(modde_core::scanner::ModFootprint::Directory(format!(
35            "mods/{name}/"
36        )))
37    }
38}