surrealpatch/lib/src/sql/base.rs
2023-02-03 11:47:07 +00:00

57 lines
1.3 KiB
Rust

use crate::sql::comment::shouldbespace;
use crate::sql::error::IResult;
use crate::sql::ident::{ident, Ident};
use nom::branch::alt;
use nom::bytes::complete::tag_no_case;
use nom::combinator::map;
use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Hash)]
pub enum Base {
Kv,
Ns,
Db,
Sc(Ident),
}
impl Default for Base {
fn default() -> Self {
Self::Kv
}
}
impl fmt::Display for Base {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Ns => f.write_str("NAMESPACE"),
Self::Db => f.write_str("DATABASE"),
Self::Sc(sc) => write!(f, "SCOPE {sc}"),
Self::Kv => f.write_str("KV"),
}
}
}
pub fn base(i: &str) -> IResult<&str, Base> {
alt((
map(tag_no_case("NAMESPACE"), |_| Base::Ns),
map(tag_no_case("DATABASE"), |_| Base::Db),
map(tag_no_case("NS"), |_| Base::Ns),
map(tag_no_case("DB"), |_| Base::Db),
))(i)
}
pub fn base_or_scope(i: &str) -> IResult<&str, Base> {
alt((
map(tag_no_case("NAMESPACE"), |_| Base::Ns),
map(tag_no_case("DATABASE"), |_| Base::Db),
map(tag_no_case("NS"), |_| Base::Ns),
map(tag_no_case("DB"), |_| Base::Db),
|i| {
let (i, _) = tag_no_case("SCOPE")(i)?;
let (i, _) = shouldbespace(i)?;
let (i, v) = ident(i)?;
Ok((i, Base::Sc(v)))
},
))(i)
}