Skip to main content

conduit_cli/core/engine/workflow/addon/
validate.rs

1use crate::{
2    core::domain::{addon::AddonType, loader::Loader},
3    core::engine::workflow::Workflow,
4    core::schemas::manifest::Manifest,
5    errors::{ConduitError, ConduitResult},
6};
7
8impl Workflow {
9    pub fn validate_compatibility(
10        &self,
11        target: &AddonType,
12        manifest: &Manifest,
13    ) -> ConduitResult<()> {
14        let loader = &manifest.project.loader;
15        let mc_version = &manifest.project.minecraft;
16
17        match (&target, loader) {
18            (AddonType::Mod, Loader::Vanilla | Loader::Paper | Loader::Purpur) => Err(
19                ConduitError::Deserialize(format!("Cannot install Mods on a {loader:?} server")),
20            ),
21            (AddonType::Plugin, l) if !matches!(l, Loader::Paper | Loader::Purpur) => Err(
22                ConduitError::Deserialize(format!("Plugins require Paper/Purpur (current: {l:?})")),
23            ),
24            (AddonType::Datapack, _) => {
25                let minor = mc_version
26                    .split('.')
27                    .nth(1)
28                    .and_then(|v| v.parse::<u32>().ok())
29                    .unwrap_or(0);
30                if minor < 13 {
31                    return Err(ConduitError::Deserialize(
32                        "Datapacks require MC 1.13+".to_string(),
33                    ));
34                }
35                Ok(())
36            }
37            _ => Ok(()),
38        }
39    }
40}