df_ls_syntax_analysis/token_deserializers/token_deserialize/
td_reference.rs1use super::super::{Argument, Token, TokenArgument, TryFromArgument, TryFromArgumentGroup};
2use super::TokenDeserialize;
3use df_ls_core::Reference;
4use df_ls_diagnostics::{hash_map, DMExtraInfo, DiagnosticsInfo};
5
6crate::token_deserialize_unary_token!(Reference);
8
9impl 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
26impl 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
73impl 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}