//! Field guards use crate::{Context, FieldResult}; /// Field guard /// /// Guard is a precondition for a field that is resolved if `Ok(()` is returned, otherwise an error is returned. #[async_trait::async_trait] pub trait Guard { #[allow(missing_docs)] async fn check(&self, ctx: &Context<'_>) -> FieldResult<()>; } /// An extension trait for `Guard` pub trait GuardExt: Guard + Sized { /// Merge the two guards. fn and(self, other: R) -> And { And(self, other) } } impl GuardExt for T {} /// Guard for `GuardExt::and` pub struct And(A, B); #[async_trait::async_trait] impl Guard for And { async fn check(&self, ctx: &Context<'_>) -> FieldResult<()> { self.0.check(ctx).await?; self.1.check(ctx).await } }