bluejay_parser/ast/
argument.rs

1use crate::ast::{FromTokens, ParseError, Tokens, Value};
2use crate::lexical_token::{Name, PunctuatorType};
3use crate::{HasSpan, Span};
4
5#[derive(Debug)]
6pub struct Argument<'a, const CONST: bool> {
7    name: Name<'a>,
8    value: Value<'a, CONST>,
9    span: Span,
10}
11
12impl<'a, const CONST: bool> Argument<'a, CONST> {
13    pub fn name(&self) -> &Name<'a> {
14        &self.name
15    }
16
17    pub fn value(&self) -> &Value<'a, CONST> {
18        &self.value
19    }
20}
21
22pub type ConstArgument<'a> = Argument<'a, true>;
23pub type VariableArgument<'a> = Argument<'a, false>;
24
25impl<'a, const CONST: bool> FromTokens<'a> for Argument<'a, CONST> {
26    #[inline]
27    fn from_tokens(tokens: &mut impl Tokens<'a>) -> Result<Self, ParseError> {
28        let name = tokens.expect_name()?;
29        tokens.expect_punctuator(PunctuatorType::Colon)?;
30        let value = Value::from_tokens(tokens)?;
31        let span = name.span().merge(value.span());
32        Ok(Self { name, value, span })
33    }
34}
35
36impl<'a, const CONST: bool> bluejay_core::Argument<CONST> for Argument<'a, CONST> {
37    type Value = Value<'a, CONST>;
38
39    fn name(&self) -> &str {
40        self.name.as_ref()
41    }
42
43    fn value(&self) -> &Value<'a, CONST> {
44        &self.value
45    }
46}
47
48impl<'a, const CONST: bool> HasSpan for Argument<'a, CONST> {
49    fn span(&self) -> &Span {
50        &self.span
51    }
52}