darklua_core/rules/bundle/
require_mode.rs

1use std::str::FromStr;
2
3use serde::{Deserialize, Serialize};
4
5use crate::rules::{
6    require::{LuauPathLocator, LuauRequireMode, PathRequireMode, RequirePathLocator},
7    RuleProcessResult,
8};
9use crate::{nodes::Block, rules::Context};
10
11use super::{path_require_mode, BundleOptions};
12
13#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
14#[serde(deny_unknown_fields, rename_all = "snake_case", tag = "name")]
15pub enum BundleRequireMode {
16    Path(PathRequireMode),
17    Luau(LuauRequireMode),
18}
19
20impl From<PathRequireMode> for BundleRequireMode {
21    fn from(mode: PathRequireMode) -> Self {
22        Self::Path(mode)
23    }
24}
25
26impl FromStr for BundleRequireMode {
27    type Err = String;
28
29    fn from_str(s: &str) -> Result<Self, Self::Err> {
30        Ok(match s {
31            "path" => Self::Path(Default::default()),
32            "luau" => Self::Luau(Default::default()),
33            _ => return Err(format!("invalid require mode `{}`", s)),
34        })
35    }
36}
37
38impl Default for BundleRequireMode {
39    fn default() -> Self {
40        Self::Path(Default::default())
41    }
42}
43
44impl BundleRequireMode {
45    pub(crate) fn process_block(
46        &self,
47        block: &mut Block,
48        context: &Context,
49        options: &BundleOptions,
50    ) -> RuleProcessResult {
51        match self {
52            Self::Path(path_require_mode) => {
53                let mut require_mode = path_require_mode.clone();
54                require_mode
55                    .initialize(context)
56                    .map_err(|err| err.to_string())?;
57
58                let locator = RequirePathLocator::new(
59                    &require_mode,
60                    context.project_location(),
61                    context.resources(),
62                );
63
64                path_require_mode::process_block(block, context, options, locator)
65            }
66            Self::Luau(luau_require_mode) => {
67                let mut require_mode = luau_require_mode.clone();
68                require_mode
69                    .initialize(context)
70                    .map_err(|err| err.to_string())?;
71
72                let locator = LuauPathLocator::new(
73                    &require_mode,
74                    context.project_location(),
75                    context.resources(),
76                );
77
78                path_require_mode::process_block(block, context, options, locator)
79            }
80        }
81    }
82}