df_ls_structure/shared_token_args/material_token_args/
local_plant_mat_arg.rs

1use df_ls_core::Reference;
2use df_ls_diagnostics::DiagnosticsInfo;
3use df_ls_syntax_analysis::{Token, TryFromArgumentGroup};
4use serde::{Deserialize, Serialize};
5
6/// Alias for `PLANT_MAT:PLANT_ID:MATERIAL_NAME`,
7/// where `PLANT_ID` is the plant currently being defined;
8/// as such, it can only be used in plant definitions.
9// #[token_de(token = "LOCAL_PLANT_MAT")]
10#[derive(Serialize, Deserialize, Clone, Debug, Default, PartialEq, Eq)]
11pub struct LocalPlantMatArg(pub Reference);
12
13impl TryFromArgumentGroup for LocalPlantMatArg {
14    fn try_from_argument_group(
15        token: &mut Token,
16        source: &str,
17        diagnostics: &mut DiagnosticsInfo,
18        add_diagnostics_on_err: bool,
19    ) -> Result<Self, ()> {
20        // Safe first argument (is not token_name) for error case
21        let arg0 = match token.get_current_arg() {
22            Ok(arg) => Ok(arg.clone()),
23            Err(err) => Err(err),
24        };
25        // Arg 0
26        let reference_arg0 =
27            Reference::try_from_argument_group(token, source, diagnostics, add_diagnostics_on_err)?;
28        // Match on Arg 0
29        let material_type = match reference_arg0.0.as_ref() {
30            "LOCAL_PLANT_MAT" => {
31                // Arg 1
32                Reference::try_from_argument_group(
33                    token,
34                    source,
35                    diagnostics,
36                    add_diagnostics_on_err,
37                )?
38            }
39            _ => {
40                Self::diagnostics_wrong_enum_type(
41                    &arg0?,
42                    vec!["LOCAL_PLANT_MAT"],
43                    source,
44                    diagnostics,
45                    add_diagnostics_on_err,
46                );
47                return Err(());
48            }
49        };
50        Ok(Self(material_type))
51    }
52}
53
54// ---------------------------- TESTS --------------------------
55#[cfg(test)]
56mod tests {
57    use super::*;
58    use df_ls_lexical_analysis::test_utils::LexerTestBuilder;
59    use df_ls_syntax_analysis::test_tree_structure;
60    use df_ls_syntax_analysis::test_utils::SyntaxTestBuilder;
61
62    #[test]
63    fn test_material_correct() {
64        let test_builder = SyntaxTestBuilder::from_lexer_test_builder(
65            LexerTestBuilder::test_source(
66                "header
67                [REF:LOCAL_PLANT_MAT:LEAF]
68                ",
69            )
70            .add_test_lexer_diagnostics_codes(vec![])
71            .add_test_lexer_diagnostics_ranges(vec![]),
72        )
73        .add_test_syntax_diagnostics_codes(vec![])
74        .add_test_syntax_diagnostics_ranges(vec![]);
75
76        test_tree_structure!(
77            test_builder,
78            [
79                (LocalPlantMatArg,) => (LocalPlantMatArg(Reference("LEAF".to_owned())),),
80            ]
81        );
82    }
83}