#![deny(warnings)]
#![allow(incomplete_features)]
#![feature(generic_associated_types)]
#![feature(adt_const_params)]
#![feature(generic_arg_infer)]
#![feature(rustc_attrs)]
#![feature(marker_trait_attr)]
use dacquiri::prelude::*;
use policy::*;
fn main() -> AttributeResult<()> {
let user = User::new(true, true);
let caller = user.into_entity::<"user">()
.check_enabled::<"user">()?;
guarded_function(caller);
Ok(())
}
fn guarded_function(caller: impl VerifiedUserPolicy) {
caller.print_message();
}
mod policy {
use dacquiri::prelude::*;
pub struct User {
enabled: bool,
verified: bool
}
impl User {
pub fn new(enabled: bool, verified: bool) -> Self {
Self { enabled, verified }
}
}
#[attribute(Enabled)]
mod enabled {
use super::User;
#[attribute]
pub fn check_enabled(user: &User) -> AttributeResult<()> {
if user.enabled {
Ok(())
} else {
Err(())
}
}
}
#[attribute(Verified)]
mod verified {
use super::User;
#[attribute]
pub fn check_verified(user: &User) -> AttributeResult<()> {
if user.verified {
Ok(())
} else {
Err(())
}
}
}
#[policy(
entities = (
user: User
),
guard = (
user is Enabled,
user is Verified,
)
)]
pub trait VerifiedUserPolicy {
fn print_message(&self) {
println!("Success!");
}
}
}