use super::super::{Argument, Token, TokenArgument, TryFromArgument, TryFromArgumentGroup};
use super::TokenDeserialize;
use df_ls_diagnostics::{hash_map, DMExtraInfo, DiagnosticsInfo};
crate::token_deserialize_unary_token!(String);
impl TryFromArgumentGroup for String {
fn try_from_argument_group(
token: &mut Token,
source: &str,
diagnostics: &mut DiagnosticsInfo,
add_diagnostics_on_err: bool,
) -> Result<Self, ()> {
token.check_as_required_argument(source, diagnostics, add_diagnostics_on_err)?;
let arg = token.get_current_arg_opt();
let result = Self::try_from_argument(arg, source, diagnostics, add_diagnostics_on_err);
token.consume_argument();
result
}
}
impl TryFromArgument for String {
fn try_from_argument(
arg_opt: Option<&Argument>,
_source: &str,
diagnostics: &mut DiagnosticsInfo,
add_diagnostics_on_err: bool,
) -> Result<Self, ()> {
if let Some(arg) = arg_opt {
match &arg.value {
TokenArgument::TVString(v) => Ok(v.clone()),
TokenArgument::TVReference(v) => {
if add_diagnostics_on_err {
diagnostics.add_message(
DMExtraInfo::new(arg.node.get_range()),
"string_is_reference",
);
}
Ok(v.clone())
}
_ => {
if add_diagnostics_on_err {
diagnostics.add_message(
DMExtraInfo {
range: arg.node.get_range(),
message_template_data: hash_map! {
"expected_parameters" => Self::expected_argument_types(),
"found_parameters" => arg.value.argument_to_token_type_name(),
},
},
"wrong_arg_type",
);
}
Err(())
}
}
} else {
Err(())
}
}
fn expected_argument_types() -> String {
"String".to_owned()
}
}
impl From<String> for TokenArgument {
fn from(item: String) -> TokenArgument {
TokenArgument::TVString(item)
}
}
impl From<Option<String>> for TokenArgument {
fn from(item: Option<String>) -> TokenArgument {
match item {
Some(v) => TokenArgument::TVString(v),
None => TokenArgument::TVEmpty,
}
}
}