blob: a1e5d4dc3e9378f05078b32744cfcee88fb13ddc [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2024 Boeing
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Boeing - initial API and implementation
**********************************************************************/
use nom::{
character::complete::char,
combinator::map,
sequence::{delimited, tuple},
IResult,
};
use crate::{
applicability_parser_syntax_tag::{self, TagVariants},
tag_parser::{substitution_tag, TokenSplit},
ApplicabilityParserSyntaxTag,
};
pub fn parse_substitution<'a>(
) -> impl FnMut(&'a str) -> IResult<&'a str, ApplicabilityParserSyntaxTag> {
let equals = char('=');
let left_brace = char('[');
let start = tuple((equals, left_brace));
let right_brace = char(']');
let inner = delimited(start, substitution_tag(), right_brace);
map(inner, |tokens| {
let substitution_type = match tokens.first().cloned() {
Some(token) => match token {
TokenSplit::And(_) => TagVariants::And,
TokenSplit::Or(_) => TagVariants::Or,
TokenSplit::AndOr(_) => TagVariants::Normal,
},
None => TagVariants::Normal,
};
let tag_list = tokens
.iter()
.map(|tag| match tag {
TokenSplit::And(tag_content)
| TokenSplit::Or(tag_content)
| TokenSplit::AndOr(tag_content) => tag_content.to_string(),
})
.collect::<Vec<String>>();
match substitution_type {
TagVariants::And => ApplicabilityParserSyntaxTag::SubstitutionAnd(
applicability_parser_syntax_tag::SubstitutionSyntaxTagAnd(tag_list),
),
TagVariants::Or => ApplicabilityParserSyntaxTag::SubstitutionOr(
applicability_parser_syntax_tag::SubstitutionSyntaxTagOr(tag_list),
),
TagVariants::Normal => match tag_list.first() {
Some(tag) => ApplicabilityParserSyntaxTag::Substitution(tag.to_owned()),
None => ApplicabilityParserSyntaxTag::Text("".to_string()),
},
}
})
}
pub fn parse_substitution_as_str<'a>() -> impl FnMut(&'a str) -> IResult<&'a str, &'a str> {
move |input: &str| {
let equals = char('=');
let left_brace = char('[');
let start = tuple((equals, left_brace));
let right_brace = char(']');
let inner = delimited(start, substitution_tag(), right_brace);
map(inner, |_tokens| input)(input)
}
}