use crate::ast::ASTComponent;
use crate::rdf::parsers::{
and, class, closed, datatype, deactivated, disjoint, equals, has_value, in_component, language_in, less_than,
less_than_or_equals, max_count, max_exclusive, max_inclusive, max_length, min_count, min_exclusive, min_inclusive,
min_length, node, node_kind, not, or, pattern, qualified_value_shape, unique_lang, xone,
};
use rudof_rdf::rdf_core::FocusRDF;
use rudof_rdf::rdf_core::parser::rdf_node_parser::{ParserExt, RDFNodeParse};
pub(crate) fn components<RDF: FocusRDF>() -> impl RDFNodeParse<RDF, Output = Vec<ASTComponent>> {
let parsers: Vec<Box<dyn RDFNodeParse<RDF, Output = Vec<ASTComponent>>>> = vec![
Box::new(node_kind()),
Box::new(datatype()),
Box::new(min_count()),
Box::new(max_count()),
Box::new(min_inclusive()),
Box::new(min_exclusive()),
Box::new(max_inclusive()),
Box::new(max_exclusive()),
Box::new(min_length()),
Box::new(max_length()),
Box::new(pattern()),
Box::new(language_in()),
Box::new(unique_lang()),
Box::new(equals()),
Box::new(disjoint()),
Box::new(less_than()),
Box::new(less_than_or_equals()),
Box::new(not()),
Box::new(and()),
Box::new(or()),
Box::new(xone()),
Box::new(node()),
Box::new(qualified_value_shape()),
Box::new(closed()),
Box::new(has_value()),
Box::new(in_component()),
Box::new(deactivated()),
];
Box::new(class()).combine_many(parsers)
}