modde_games/bg3/
scanner.rs1use anyhow::Result;
4
5use crate::scanner_patterns::SingleFileModRule;
6use crate::traits::{DiscoveredMod, ModScanner, ScanContext};
7
8pub struct Bg3Scanner;
10
11pub static BG3_SCANNER: Bg3Scanner = Bg3Scanner;
12
13impl ModScanner for Bg3Scanner {
14 fn scan_directories(&self) -> &[&str] {
15 &["Mods"]
16 }
17
18 fn scan_filesystem(&self, ctx: &ScanContext<'_>) -> Result<Vec<DiscoveredMod>> {
19 let data_root = super::data_root_from_install(ctx.install_dir);
20 let scan_root = if data_root.join("Mods").is_dir() {
21 data_root
22 } else {
23 ctx.install_dir.to_path_buf()
24 };
25 let mut out = Vec::new();
26 SingleFileModRule {
27 rel_dir: "Mods",
28 extension: "pak",
29 ignored_prefixes: &[],
30 mod_id_prefix: "pak",
31 source_location: "Mods",
32 confidence: 0.95,
33 }
34 .scan(&scan_root, &mut out)?;
35 Ok(out)
36 }
37
38 fn mod_id_footprint(&self, mod_id: &str) -> Option<modde_core::scanner::ModFootprint> {
39 let stem = mod_id.strip_prefix("pak/")?.to_lowercase();
40 Some(modde_core::scanner::ModFootprint::File(format!(
41 "mods/{stem}.pak"
42 )))
43 }
44}