triples 0.2.5

A lib and cli for storing data triples
Documentation
grammar;

use crate::sparql_data::SelectClause;
use crate::sparql_data::SparqlQuery;
use crate::sparql_data::TriplePattern;
use crate::sparql_data::Variable;

pub Query: SparqlQuery = {
    "SELECT" <select_cl:SelectClause> "WHERE" "{" <triples_bl:TriplesBlock> "}" =>
        SparqlQuery { select_clause: select_cl, triples_block: triples_bl },
};

SelectClause: SelectClause = {
    "DISTINCT" <vars:Variables> =>
        SelectClause { distinct: true, variables: vars },
};

Variables: Vec<Variable> = {
    <v:Variable+> => v,
};

Variable: Variable = {
    "<" <sparql_iri:SPARQL_IRI> ">" => Variable::IRI(sparql_iri),
    "?" <sparql_var:SPARQL_VAR> => Variable::Var(sparql_var),
};

TriplesBlock: Vec<TriplePattern> = {
    <pat:TriplePattern+> => pat,
};

TriplePattern: TriplePattern = {
    <s:Variable> <p:SPARQL_IRI> <o:Variable> ("."?) =>
        TriplePattern { subject: s, predicate: p, object: o },
};

// This will parse SPARQL variables like "?s", "?metric", "?appname"
SPARQL_VAR: String = <v:r"[a-zA-Z_][a-zA-Z0-9_]*"> => v.to_string();

// This will parse SPARQL IRI references enclosed in angle brackets
SPARQL_IRI: String = <i:r"<http://[^\s<>]+>"> => i[1..i.len()-1].to_string();