castle_query_parser 0.20.2

Castle Query Parser, parses query string for Castle Query
Documentation
#![feature(if_let_guard)]

pub(crate) mod parsers;

use std::collections::HashMap;

use castle_types::{Message, CastleError};
use parsers::parse_projection::{parse_projection};
use castle_tokenizer::{Tokenizer, Tokenizable, TokenKind, Keyword, Punctuator};

pub fn parse_message(msg: &str) -> Result<Message, CastleError> {
    let bytes = msg.as_bytes();
    let mut tokenizer = Tokenizer::new(bytes);
    Ok(Message {
        projection: match tokenizer.next(true)? {
            Some(token) if let TokenKind::Keyword(Keyword::Message) = token.kind => {
                parse_projection(&mut tokenizer, Punctuator::OpenBlock, Punctuator::CloseBlock)?
            }
            Some(token) => return Err(CastleError::Parser(
                format!("Expected keyword or EOF, got: {:?}", token.kind).into(),
                token.span
            )),
            None => HashMap::new(),
        },
    })
}