1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use crate::errors::parser_error::ParserError;
use crate::parser::constants::IF_KEYWORD;
use crate::parser::kconfig_parser_impl::parser_traits::{Parseable, ParsingContext};
use crate::parser::utils::tokenizer::LineKConfigTokenizerIterator;
use crate::structure::atoms::KconfigExpression;
use crate::structure::kconfig_node_children::KconfigNodeChildren;
use crate::structure::nodes::KconfigIfNode;
impl Parseable for KconfigIfNode {
fn parse(context: &ParsingContext) -> Result<Self, ParserError> {
let span = context.span;
let header_line = span.get_source_span()[0];
let mut header_tokens = LineKConfigTokenizerIterator::from_line(header_line);
if !header_tokens.next()
.contains(&IF_KEYWORD)
{
return Err(ParserError::syntax_in_span_at("Expected if keyword", &span, 0));
}
let expr_src = header_tokens.get_remaining_slice().trim();
let expr = KconfigExpression::new(expr_src.to_string());
let children_span = span.get_with_bounds(1, span.len()-2);
let children_node = KconfigNodeChildren::parse(&context.with_different_span(&children_span))?;
Ok(Self {
condition: expr,
children: children_node,
})
}
}