/*
* Copyright (c) 2020-2023, Stalwart Labs Ltd.
*
* This file is part of the Stalwart Sieve Interpreter.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
* in the LICENSE file at the top-level directory of this distribution.
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*
* You can be released from the requirements of the AGPLv3 license by
* purchasing a commercial license. Please contact licensing@stalw.art
* for more details.
*/
use std::{
iter::{Enumerate, Peekable},
slice::Iter,
};
use crate::sieve::{compiler::Number, runtime::eval::IntoString};
use super::{BinaryOperator, Token, UnaryOperator};
pub(crate) struct Tokenizer<'x, F>
where
F: Fn(&str, bool) -> Result,
{
pub(crate) iter: Peekable>>,
token_map: F,
buf: Vec,
depth: u32,
next_token: Vec,
has_number: bool,
has_dot: bool,
has_alpha: bool,
is_start: bool,
is_eof: bool,
}
impl<'x, F> Tokenizer<'x, F>
where
F: Fn(&str, bool) -> Result,
{
#[cfg(test)]
pub fn new(expr: &'x str, token_map: F) -> Self {
Self::from_iter(expr.as_bytes().iter().enumerate().peekable(), token_map)
}
#[allow(clippy::should_implement_trait)]
pub(crate) fn from_iter(iter: Peekable>>, token_map: F) -> Self {
Self {
iter,
buf: Vec::new(),
depth: 0,
next_token: Vec::with_capacity(2),
has_number: false,
has_dot: false,
has_alpha: false,
is_start: true,
is_eof: false,
token_map,
}
}
#[allow(clippy::should_implement_trait)]
pub(crate) fn next(&mut self) -> Result