use surrealdb_types::{SqlFormat, ToSql, write_sql};
use super::DefineKind;
use crate::access::AccessDuration;
use crate::{AccessType, Base, CoverStmts, Expr, Literal};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct DefineAccessStatement {
pub kind: DefineKind,
pub name: Expr,
pub base: Base,
pub access_type: AccessType,
pub authenticate: Option<Expr>,
pub context: Option<Expr>,
pub duration: AccessDuration,
pub comment: Expr,
}
impl ToSql for DefineAccessStatement {
fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
write_sql!(f, fmt, "DEFINE ACCESS");
match self.kind {
DefineKind::Default => {}
DefineKind::Overwrite => {
write_sql!(f, fmt, " OVERWRITE");
}
DefineKind::IfNotExists => {
write_sql!(f, fmt, " IF NOT EXISTS");
}
}
write_sql!(
f,
fmt,
" {} ON {} TYPE {}",
CoverStmts(&self.name),
self.base,
self.access_type
);
if let Some(ref v) = self.authenticate {
write_sql!(f, fmt, " AUTHENTICATE {}", CoverStmts(v))
}
if let Some(ref v) = self.context {
write_sql!(f, fmt, " CONTEXT {}", CoverStmts(v))
}
write_sql!(f, fmt, " DURATION");
if self.access_type.can_issue_grants() {
write_sql!(f, fmt, " FOR GRANT {},", CoverStmts(&self.duration.grant));
}
if self.access_type.can_issue_tokens() {
write_sql!(f, fmt, " FOR TOKEN {},", CoverStmts(&self.duration.token));
}
write_sql!(f, fmt, " FOR SESSION {}", CoverStmts(&self.duration.session));
if !matches!(self.comment, Expr::Literal(Literal::None)) {
write_sql!(f, fmt, " COMMENT {}", CoverStmts(&self.comment));
}
}
}