castle_query_parser/
lib.rs

1#![feature(if_let_guard)]
2
3pub(crate) mod parsers;
4
5use std::collections::HashMap;
6
7use castle_types::{Message, CastleError};
8use parsers::parse_projection::{parse_projection};
9use castle_tokenizer::{Tokenizer, Tokenizable, TokenKind, Keyword, Punctuator};
10
11pub fn parse_message(msg: &str) -> Result<Message, CastleError> {
12    let bytes = msg.as_bytes();
13    let mut tokenizer = Tokenizer::new(bytes);
14    Ok(Message {
15        projection: match tokenizer.next(true)? {
16            Some(token) if let TokenKind::Keyword(Keyword::Message) = token.kind => {
17                parse_projection(&mut tokenizer, Punctuator::OpenBlock, Punctuator::CloseBlock)?
18            }
19            Some(token) => return Err(CastleError::Parser(
20                format!("Expected keyword or EOF, got: {:?}", token.kind).into(),
21                token.span
22            )),
23            None => HashMap::new(),
24        },
25    })
26}
27