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}