creeper 1.0.0-alpha.11

Minecraft Package Manager
use std::{
    collections::HashMap,
    env::consts::{ARCH, OS},
};

use mc_launchermeta::version::rule::{Os, Rule};

#[derive(Default)]
pub struct RuleChecker {
    feature: HashMap<String, bool>,
}

impl RuleChecker {
    pub fn checker(&self) -> impl Fn(&Rule) -> bool {
        move |rule| self.check(rule)
    }

    pub fn check(&self, rule: &Rule) -> bool {
        let os = rule.os.as_ref().is_none_or(Self::check_os);

        let feature = rule.features.iter().all(|(k, v)| {
            let enable = self.feature.get(k).unwrap_or(&false);

            enable == v
        });

        let apply = os && feature;

        match rule.action {
            mc_launchermeta::version::rule::RuleAction::Allow => apply,
            mc_launchermeta::version::rule::RuleAction::Disallow => !apply,
        }
    }

    pub fn check_os(os: &Os) -> bool {
        let name = os.name.as_ref().is_none_or(|x| match x {
            mc_launchermeta::version::rule::OsName::Windows => OS == "windows",
            mc_launchermeta::version::rule::OsName::Osx => OS == "macos",
            mc_launchermeta::version::rule::OsName::Linux => OS == "linux",
        });

        let arch = os.arch.as_ref().is_none_or(|x| match x {
            mc_launchermeta::version::rule::OsArch::X86 => ARCH == "x86" || ARCH == "x86_64",
        });

        let version = os
            .version
            .as_ref()
            .is_none_or(|_| todo!("does not support checking OS version"));

        name && arch && version
    }
}