ntriples_parser/
lib.rs

1mod lexer;
2
3use lexer::Token;
4use logos::Logos;
5
6pub struct Triple<'a>(pub &'a [u8], pub &'a [u8], pub &'a [u8]);
7
8pub fn parse<'a>(input: &'a [u8]) -> Result<Vec<Triple<'a>>, ()> {
9    let tokens = Token::lexer(input);
10    let mut triples = Vec::new();
11    let mut counter: u8 = 0;
12    let mut subject: &[u8] = &[];
13    let mut predicate: &[u8] = &[];
14    for token in tokens {
15        let token = token.unwrap();
16        match (counter, token) {
17            (0, Token::Iri(bytes) | Token::BlankNode(bytes)) => {
18                subject = bytes;
19            }
20            (0, token) => {
21                panic!("Expected iri or blanknode, found {token:?}");
22            }
23            (1, Token::Iri(bytes)) => {
24                predicate = bytes;
25            }
26            (1, token) => {
27                panic!("Expected iri, found {token:?}");
28            }
29            (2, Token::Literal(bytes) | Token::Iri(bytes)) => {
30                triples.push(Triple(subject, predicate, bytes))
31            }
32            (2, token) => {
33                panic!("Expected iri or literal, found {token:?}");
34            }
35            (3, Token::Dot) => {}
36            (3, token) => {
37                panic!("Expected dot, found {token:?}");
38            }
39            _ => {
40                panic!("math is broken")
41            }
42        }
43        counter = (counter + 1) % 4;
44    }
45    return Ok(triples);
46}