mod naive;
#[cfg(test)]
mod tests;
use keyvalues_parser::{Obj, Value, Vdf};
use std::{
borrow::Cow,
ops::{Deref, DerefMut},
};
pub use crate::tokens::naive::{NaiveToken, NaiveTokenStream};
#[derive(Debug, PartialEq, Eq)]
pub struct TokenStream<'a>(pub Vec<Token<'a>>);
impl<'a> Deref for TokenStream<'a> {
type Target = Vec<Token<'a>>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for TokenStream<'_> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl<'a> From<Vdf<'a>> for TokenStream<'a> {
fn from(vdf: Vdf<'a>) -> Self {
let Vdf { key, value } = vdf;
let mut inner = vec![Token::Key(key)];
inner.extend(TokenStream::from(value).0);
Self(inner)
}
}
impl<'a> From<Value<'a>> for TokenStream<'a> {
fn from(value: Value<'a>) -> Self {
let mut inner = Vec::new();
match value {
Value::Str(s) => inner.push(Token::Str(s)),
Value::Obj(obj) => {
inner.push(Token::ObjBegin);
inner.extend(Self::from(obj).0);
inner.push(Token::ObjEnd);
}
}
Self(inner)
}
}
impl<'a> From<Obj<'a>> for TokenStream<'a> {
fn from(obj: Obj<'a>) -> Self {
let mut inner = Vec::new();
for (key, values) in obj.into_inner().into_iter() {
inner.push(Token::Key(key));
let num_values = values.len();
if num_values != 1 {
inner.push(Token::SeqBegin);
}
for value in values {
inner.extend(TokenStream::from(value).0);
}
if num_values != 1 {
inner.push(Token::SeqEnd);
}
}
Self(inner)
}
}
#[derive(Debug, PartialEq, Eq)]
pub enum Token<'a> {
Key(Cow<'a, str>),
Str(Cow<'a, str>),
ObjBegin,
ObjEnd,
SeqBegin,
SeqEnd,
}