castle_query_parser/
lib.rs1#![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