pub struct Validator { /* private fields */ }Expand description
The constraint validator.
Validates proposed changes against a set of constraints and the current committed state. Violations are resolved via declarative policies:
- AUTO_RESOLVED — policy handles it (e.g., LAST_WRITER_WINS)
- DEFERRED — queued for exponential backoff retry (CASCADE_DEFER)
- WEBHOOK_REQUIRED — caller must POST to webhook for decision
- ESCALATE — route to dead-letter queue (fallback)
Implementations§
Source§impl Validator
impl Validator
Sourcepub fn new(constraints: ConstraintSet, dlq_capacity: usize) -> Self
pub fn new(constraints: ConstraintSet, dlq_capacity: usize) -> Self
Create a new validator with default (ephemeral) policies.
Sourcepub fn new_with_policies(
constraints: ConstraintSet,
dlq_capacity: usize,
policies: PolicyRegistry,
deferred_capacity: usize,
) -> Self
pub fn new_with_policies( constraints: ConstraintSet, dlq_capacity: usize, policies: PolicyRegistry, deferred_capacity: usize, ) -> Self
Create a new validator with custom policies and deferred queue.
Sourcepub fn mark_bitemporal(&mut self, collection: impl Into<String>)
pub fn mark_bitemporal(&mut self, collection: impl Into<String>)
Register a collection as bitemporal. UNIQUE constraints for rows in this collection will scope to currently-live rows only.
Sourcepub fn is_bitemporal(&self, collection: &str) -> bool
pub fn is_bitemporal(&self, collection: &str) -> bool
Is the given collection registered as bitemporal?
Sourcepub fn dlq(&self) -> &DeadLetterQueue
pub fn dlq(&self) -> &DeadLetterQueue
Access the dead-letter queue.
Sourcepub fn dlq_mut(&mut self) -> &mut DeadLetterQueue
pub fn dlq_mut(&mut self) -> &mut DeadLetterQueue
Mutable access to the DLQ (for dequeue/retry).
Sourcepub fn policies(&self) -> &PolicyRegistry
pub fn policies(&self) -> &PolicyRegistry
Access the policy registry.
Sourcepub fn policies_mut(&mut self) -> &mut PolicyRegistry
pub fn policies_mut(&mut self) -> &mut PolicyRegistry
Mutable access to the policy registry.
Sourcepub fn deferred(&self) -> &DeferredQueue
pub fn deferred(&self) -> &DeferredQueue
Access the deferred queue.
Sourcepub fn deferred_mut(&mut self) -> &mut DeferredQueue
pub fn deferred_mut(&mut self) -> &mut DeferredQueue
Mutable access to the deferred queue.
Sourcepub fn set_delta_verifier(&mut self, verifier: DeltaSigner)
pub fn set_delta_verifier(&mut self, verifier: DeltaSigner)
Set the delta signature verifier. When set, deltas with non-zero signatures in their CrdtAuthContext will be verified before validation.
Sourcepub fn delta_verifier(&self) -> Option<&DeltaSigner>
pub fn delta_verifier(&self) -> Option<&DeltaSigner>
Access the delta verifier.
Sourcepub fn delta_verifier_mut(&mut self) -> Option<&mut DeltaSigner>
pub fn delta_verifier_mut(&mut self) -> Option<&mut DeltaSigner>
Mutable access to the delta verifier.
Source§impl Validator
impl Validator
Sourcepub fn validate_with_policy(
&mut self,
state: &CrdtState,
peer_id: u64,
auth: CrdtAuthContext,
change: &ProposedChange,
delta_bytes: Vec<u8>,
hlc_timestamp: u64,
) -> Result<PolicyResolution>
pub fn validate_with_policy( &mut self, state: &CrdtState, peer_id: u64, auth: CrdtAuthContext, change: &ProposedChange, delta_bytes: Vec<u8>, hlc_timestamp: u64, ) -> Result<PolicyResolution>
Validate with declarative policy resolution.
This is the new core validation method. It attempts to resolve violations via policy before falling back to the DLQ.
§Arguments
state— current CRDT statepeer_id— source peer IDchange— proposed changedelta_bytes— raw delta byteshlc_timestamp— Hybrid Logical Clock timestamp of the incoming write
Returns:
Ok(PolicyResolution::AutoResolved(_))if the policy auto-fixed the violationOk(PolicyResolution::Deferred { .. })if deferred for retry (entry already enqueued)Ok(PolicyResolution::WebhookRequired { .. })if webhook call needed (caller’s responsibility)Ok(PolicyResolution::Escalate)if escalating to DLQ (entry already enqueued)Err(_)if an internal error occurred
Source§impl Validator
impl Validator
Sourcepub fn validate(
&self,
state: &CrdtState,
change: &ProposedChange,
) -> ValidationOutcome
pub fn validate( &self, state: &CrdtState, change: &ProposedChange, ) -> ValidationOutcome
Validate a proposed change against all applicable constraints.
Returns Accepted if all constraints pass, or Rejected with
detailed violation information.
Sourcepub fn validate_or_reject(
&mut self,
state: &CrdtState,
peer_id: u64,
auth: CrdtAuthContext,
change: &ProposedChange,
delta_bytes: Vec<u8>,
) -> Result<()>
pub fn validate_or_reject( &mut self, state: &CrdtState, peer_id: u64, auth: CrdtAuthContext, change: &ProposedChange, delta_bytes: Vec<u8>, ) -> Result<()>
Validate and apply declarative policy resolution.
§Replay protection
When auth.delta_signature is non-zero, the following steps execute
in this order to prevent replay attacks at minimum cost:
- Cheap seq_no check —
seq_no > last_seen[(user_id, device_id)]. Fails fast before any HMAC computation. - HMAC verification — constant-time comparison prevents timing attacks.
- Atomic seq update —
last_seenadvances only on success.
For accepted changes, returns Ok(()). For violations, applies policy and:
- If AutoResolved: returns Ok(())
- If Deferred/Webhook/Escalate: returns appropriate error
Auto Trait Implementations§
impl Freeze for Validator
impl RefUnwindSafe for Validator
impl Send for Validator
impl Sync for Validator
impl Unpin for Validator
impl UnsafeUnpin for Validator
impl UnwindSafe for Validator
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.