pub enum ApprovalThreshold {
Approvals(u32),
Unsatisfiable,
}Expand description
The approval bar an accepted ApprovalRequest must clear, as the mode
resolves it against the session’s bound policy.
Returned by QuorumMode::effective_threshold and, wrapped, by
QuorumMode::effective_threshold_for_session. Both variants are
reachable; “this session has no ApprovalRequest yet” is not a variant
here — that question is answered by the Option the session-level
accessor returns, so the two cannot be confused.
The policy’s own inert case (threshold.value <= 0, which includes the
schema default and therefore every session with no threshold rule at
all) is not a variant either: the mode’s documented fallback for it is
the ApprovalRequest’s own required_approvals, so it arrives here
already resolved as Approvals(required_approvals). Surfacing
macp_core::policy::rules::EffectiveThreshold::Inert instead would hand
the fallback rule back to the caller, which is the re-implementation this
accessor exists to delete (issue #146).
Deliberately not #[non_exhaustive], matching
macp_core::policy::rules::EffectiveThreshold and for the same reason:
a _ arm in a caller would silently reinterpret a future variant as one
of these, and silently mis-handling a governance bar is the defect class
issue #145 was. Adding a variant is a major cargo-semver-checks lint
(enum_variant_added) and release-plz.toml sets semver_check = true,
so it blocks the release PR rather than slipping out.
Variants§
Approvals(u32)
This many Approve ballots seal a positive commitment.
Never zero, and for a session whose ApprovalRequest the mode
accepted, never above the declared participant count: on_message
constrains both the payload field and any policy replacement for it to
1..=participants.
Unsatisfiable
The bound policy admits no positive commitment at any approval count.
Reached by threshold.type: "weighted" (not implemented here), an
unrecognised type, or a percentage over an empty participant set —
see macp_core::policy::rules::EffectiveThreshold::Unsatisfiable.
RegisterPolicy refuses the first two, so a session can only carry
such a policy if the PolicyDefinition was constructed directly (or
restored from a checkpoint that predates those checks). The third is
not catchable at registration — there is no participant count there —
and is blocked by QuorumMode::on_session_start rejecting an empty
participant set. The mode seals neither outcome on such a session,
positive or negative.
Trait Implementations§
Source§impl Clone for ApprovalThreshold
impl Clone for ApprovalThreshold
Source§fn clone(&self) -> ApprovalThreshold
fn clone(&self) -> ApprovalThreshold
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for ApprovalThreshold
Source§impl Debug for ApprovalThreshold
impl Debug for ApprovalThreshold
impl Eq for ApprovalThreshold
Source§impl PartialEq for ApprovalThreshold
impl PartialEq for ApprovalThreshold
impl StructuralPartialEq for ApprovalThreshold
Auto Trait Implementations§
impl Freeze for ApprovalThreshold
impl RefUnwindSafe for ApprovalThreshold
impl Send for ApprovalThreshold
impl Sync for ApprovalThreshold
impl Unpin for ApprovalThreshold
impl UnsafeUnpin for ApprovalThreshold
impl UnwindSafe for ApprovalThreshold
Blanket Implementations§
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request