Skip to content

Commit

Permalink
✨ New disable condition type: variable defined in manifest
Browse files Browse the repository at this point in the history
  • Loading branch information
mleduque committed Jun 27, 2024
1 parent 6fcf9c3 commit 2b502a2
Show file tree
Hide file tree
Showing 8 changed files with 193 additions and 42 deletions.
21 changes: 21 additions & 0 deletions modda-lib/resources/test/manifest_with_global_conditions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
version: "1"
global:
lang_dir: "fr_FR"
lang_preferences:
- french
manifest_conditions:
a:
because: this is really not good
b:
not:
because: it really works!
c:
all:
- env_is_set: my_env_var
- file:
in_file: my_file.txt
key: my_key
d:
any:
- manifest_condition: a

128 changes: 90 additions & 38 deletions modda-lib/src/module/disable_condition.rs

Large diffs are not rendered by default.

53 changes: 53 additions & 0 deletions modda-lib/src/module/manifest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ use crate::utils::pathext;

use super::global_locations::{GlobalLocations, LocationRegistry};
use super::location::ConcreteLocation;
use super::manifest_conditions::ManifestConditions;


#[derive(Deserialize, Serialize, Debug)]
Expand All @@ -38,6 +39,10 @@ pub struct Manifest {
#[serde(default)]
#[serde(skip_serializing_if = "GlobalLocations::is_empty")]
pub locations: GlobalLocations,
/// List of global conditions
#[serde(default)]
#[serde(skip_serializing_if = "ManifestConditions::is_empty")]
pub manifest_conditions: ManifestConditions,
/// List of modules
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
Expand Down Expand Up @@ -242,19 +247,22 @@ fn try_replace_component(re: &Regex, haystack: &str) -> Result<String> {
#[cfg(test)]
mod test_deserialize {

use std::collections::HashMap;
use std::io::BufReader;
use std::path::PathBuf;

use crate::canon_path::CanonPath;
use crate::module::components::{Component, Components, FullComponent};
use crate::lowercase::lwc;
use crate::module::disable_condition::DisableCondition;
use crate::module::file_module_origin::FileModuleOrigin;
use crate::module::gen_mod::{GeneratedMod, GenModComponent};
use crate::module::global_locations::{GlobalLocations, LocationRegistry};
use crate::module::location::github::GithubDescriptor;
use crate::module::location::http::Http;
use crate::module::location::{ConcreteLocation, Location};
use crate::module::location::source::Source;
use crate::module::manifest_conditions::ManifestConditions;
use crate::module::module::Module;
use crate::module::weidu_mod::WeiduMod;
use crate::post_install::PostInstall;
Expand All @@ -277,6 +285,7 @@ mod test_deserialize {
local_files: None,
},
locations : GlobalLocations::default(),
manifest_conditions: ManifestConditions::default(),
modules : vec![],
}
)
Expand All @@ -298,6 +307,7 @@ mod test_deserialize {
local_files: None,
},
locations : GlobalLocations::default(),
manifest_conditions: ManifestConditions::default(),
modules : vec![
Module::Mod {
weidu_mod: WeiduMod {
Expand Down Expand Up @@ -374,6 +384,7 @@ mod test_deserialize {
local_files: None,
},
locations : GlobalLocations::default(),
manifest_conditions: ManifestConditions::default(),
modules : vec![
Module::Mod {
weidu_mod: WeiduMod {
Expand Down Expand Up @@ -453,6 +464,7 @@ mod test_deserialize {
..Default::default()
}), ..Default::default() })
]).with_external(LocationRegistry::Absolute { path: "/directory/locations.yml".to_owned() }),
manifest_conditions: ManifestConditions::default(),
modules : vec![],
}
)
Expand All @@ -474,6 +486,7 @@ mod test_deserialize {
local_files: None,
},
locations : GlobalLocations::from([]),
manifest_conditions: ManifestConditions::default(),
modules : vec![],
}
)
Expand Down Expand Up @@ -505,6 +518,7 @@ mod test_deserialize {
..Default::default()
}), ..Default::default() })
]).with_external(LocationRegistry::Local { local: "registries/external-locations.yml".to_owned() }),
manifest_conditions: ManifestConditions::default(),
modules : vec![],
}
)
Expand Down Expand Up @@ -546,6 +560,7 @@ mod test_deserialize {
},
],
locations: GlobalLocations::default(),
manifest_conditions: ManifestConditions::default(),
}
);
}
Expand Down Expand Up @@ -586,6 +601,7 @@ mod test_deserialize {
},
],
locations: GlobalLocations::default(),
manifest_conditions: ManifestConditions::default(),
};
manifest.write(&output_path, true).unwrap();

Expand All @@ -597,4 +613,41 @@ mod test_deserialize {
assert!(content.contains("- 1 # yaml comment 123"));
assert!(content.contains("- 2 # comment as field 789"));
}

#[test]
fn read_manifest_with_global_condition() {
let manifest_root = format!("{}/{}", env!("CARGO_MANIFEST_DIR"), "resources/test");
let manifest_path = format!("{}/{}", manifest_root, "manifest_with_global_conditions.yml");
let manifest = Manifest::read_path_convert_comments(&PathBuf::from(manifest_path)).unwrap();
assert_eq!(
manifest,
super::Manifest {
version : "1".to_string(),
global : super::Global {
game_language: "fr_FR".to_string(),
lang_preferences: Some(vec!["french".to_string()]),
..Default::default()
},
locations: GlobalLocations::default(),
manifest_conditions: ManifestConditions::new(HashMap::from([
("a".to_string(), DisableCondition::Because { because: "this is really not good".to_string() }),
("b".to_string(), DisableCondition::Not {
not: Box::new(DisableCondition::Because { because: "it really works!".to_string() }),
}),
("c".to_string(), DisableCondition::All {
all: vec![
DisableCondition::EnvVar { env_is_set: "my_env_var".to_string() },
DisableCondition::File { in_file: "my_file.txt".to_string(), key: "my_key".to_string() },
],
}),
("d".to_string(), DisableCondition::Any {
any: vec![
DisableCondition::ManifestCondition { manifest_condition: "a".to_string() },
],
}),
])),
modules: vec! [],
}
);
}
}
21 changes: 21 additions & 0 deletions modda-lib/src/module/manifest_conditions.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
use std::collections::HashMap;

use serde::{Deserialize, Serialize};

use super::disable_condition::DisableCondition;


#[derive(Deserialize, Serialize, Debug, PartialEq, Default, Clone)]
pub struct ManifestConditions (HashMap<String, DisableCondition>);

impl ManifestConditions {
pub fn new(conditions: HashMap<String, DisableCondition>) -> Self { Self(conditions) }

pub fn is_empty(&self) -> bool {
self.0.is_empty()
}

pub fn get(&self, key: &str) -> Option<&DisableCondition>{
self.0.get(key)
}
}
1 change: 1 addition & 0 deletions modda-lib/src/module/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ pub mod install_comment;
pub mod language;
pub mod location;
pub mod manifest;
pub mod manifest_conditions;
pub mod module;
pub mod module_conf;
pub mod pre_copy_command;
Expand Down
7 changes: 4 additions & 3 deletions modda-lib/src/module/module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ use crate::post_install::{PostInstallExec, PostInstallOutcome};

use super::disable_condition::{DisableCheck, DisableOutCome};
use super::gen_mod::GeneratedMod;
use super::manifest_conditions::ManifestConditions;
use super::weidu_mod::WeiduMod;


Expand Down Expand Up @@ -57,10 +58,10 @@ impl Module {
}
}

pub fn check_disabled(&self, manifest_root: &CanonPath) -> Result<DisableOutCome> {
pub fn check_disabled(&self, manifest_root: &CanonPath, manifest_conditions: &ManifestConditions) -> Result<DisableOutCome> {
match self {
Module::Mod { weidu_mod } => weidu_mod.disabled_if.check(manifest_root),
Module::Generated { gen } => gen.disabled_if.check(manifest_root),
Module::Mod { weidu_mod } => weidu_mod.disabled_if.check(manifest_root, manifest_conditions),
Module::Generated { gen } => gen.disabled_if.check(manifest_root, manifest_conditions),
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions modda-lib/src/sub/extract_manifest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ use crate::log_parser::{parse_weidu_log, LogRow};
use crate::lowercase::lwc;
use crate::module::global_locations::GlobalLocations;
use crate::module::manifest::Manifest;
use crate::module::manifest_conditions::ManifestConditions;
use crate::module::module::Module;
use crate::module::weidu_mod::BareMod;
use crate::unique_component::UniqueComponent;
Expand Down Expand Up @@ -63,6 +64,7 @@ pub fn generate_manifest(game_dir: &CanonPath, modules: Vec<Module>) -> Result<M
Ok(Manifest {
version: "1".to_string(),
locations : GlobalLocations::default(),
manifest_conditions: ManifestConditions::default(),
global: Global {
game_language: lang_dir.clone(),
lang_preferences: default_lang_pref(&lang_dir),
Expand Down
2 changes: 1 addition & 1 deletion modda-lib/src/sub/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ pub fn install(opts: &Install, settings: &Config, game_dir: &CanonPath, cache: &
bail!("Aborting - proceeding with `install` is unsafe (could uninstall then install modules repeatedly)");
}
}
let process_result = match module.check_disabled(&opts.get_manifest_root(game_dir)) {
let process_result = match module.check_disabled(&opts.get_manifest_root(game_dir), &manifest.manifest_conditions) {
Ok(DisableOutCome::No(reason)) => {
if let Some(reason) = reason {
info!("module {name} is not disabled - {reason}", name = module.get_name());
Expand Down

0 comments on commit 2b502a2

Please sign in to comment.