df_ls_syntax_analysis/token_deserializers/token_deserialize/
td_reference.rs

1use super::super::{Argument, Token, TokenArgument, TryFromArgument, TryFromArgumentGroup};
2use super::TokenDeserialize;
3use df_ls_core::Reference;
4use df_ls_diagnostics::{hash_map, DMExtraInfo, DiagnosticsInfo};
5
6// Deserialize a token with following pattern: `[REF:REF]`
7crate::token_deserialize_unary_token!(Reference);
8
9// ------------------------- Convert a group of arguments to Self -----------------------
10
11impl TryFromArgumentGroup for Reference {
12    fn try_from_argument_group(
13        token: &mut Token,
14        source: &str,
15        diagnostics: &mut DiagnosticsInfo,
16        add_diagnostics_on_err: bool,
17    ) -> Result<Self, ()> {
18        token.check_as_required_argument(source, diagnostics, add_diagnostics_on_err)?;
19        let arg = token.get_current_arg_opt();
20        let result = Self::try_from_argument(arg, source, diagnostics, add_diagnostics_on_err);
21        token.consume_argument();
22        result
23    }
24}
25
26// -------------------------Convert one argument to Self -----------------------
27
28impl TryFromArgument for Reference {
29    fn try_from_argument(
30        arg_opt: Option<&Argument>,
31        _source: &str,
32        diagnostics: &mut DiagnosticsInfo,
33        add_diagnostics_on_err: bool,
34    ) -> Result<Self, ()> {
35        if let Some(arg) = arg_opt {
36            match &arg.value {
37                TokenArgument::TVReference(v) => Ok(Reference(v.clone())),
38                TokenArgument::TVString(v) => {
39                    if add_diagnostics_on_err {
40                        diagnostics.add_message(
41                            DMExtraInfo::new(arg.node.get_range()),
42                            "reference_is_string",
43                        );
44                    }
45                    Ok(Reference(v.clone()))
46                }
47                _ => {
48                    if add_diagnostics_on_err {
49                        diagnostics.add_message(
50                            DMExtraInfo {
51                                range: arg.node.get_range(),
52                                message_template_data: hash_map! {
53                                    "expected_parameters" => Self::expected_argument_types(),
54                                    "found_parameters" => arg.value.argument_to_token_type_name(),
55                                },
56                            },
57                            "wrong_arg_type",
58                        );
59                    }
60                    Err(())
61                }
62            }
63        } else {
64            Err(())
65        }
66    }
67
68    fn expected_argument_types() -> String {
69        "Reference".to_owned()
70    }
71}
72
73// -------------------------Convert from TokenArgument -----------------------
74
75impl From<Reference> for TokenArgument {
76    fn from(item: Reference) -> TokenArgument {
77        TokenArgument::TVReference(item.0)
78    }
79}
80
81impl From<Option<Reference>> for TokenArgument {
82    fn from(item: Option<Reference>) -> TokenArgument {
83        match item {
84            Some(v) => TokenArgument::TVReference(v.0),
85            None => TokenArgument::TVEmpty,
86        }
87    }
88}