darklua_core/rules/bundle/
require_mode.rs1use 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}