Skip to main content

PolicyOutcome

Enum PolicyOutcome 

Source
pub enum PolicyOutcome {
    Found(AclDocument),
    Missing,
    Invalid {
        policy_path: String,
        reason: InvalidPolicyReason,
    },
    Unavailable {
        policy_path: String,
        detail: String,
    },
}
Expand description

The terminal result of resolving the effective policy for a resource.

See the module docs for the handling contract. The key invariant: only Missing may inherit.

Variants§

§

Found(AclDocument)

A policy document was located and parsed. inherited on the document records whether it came from an ancestor container.

§

Missing

No policy exists at the resource or at any ancestor up to the root.

This is absence, not failure: the walk completed and found nothing. The evaluator still denies by default (no ACL grants nothing), but the resolution itself succeeded.

§

Invalid

A policy document exists at policy_path but could not be parsed.

Deny. Never inherit past it.

Fields

§policy_path: String

Storage key of the offending .acl sidecar.

§reason: InvalidPolicyReason

Why the parse failed.

§

Unavailable

The backend could not be read at policy_path.

Deny or surface an error. Never inherit past it — the policy’s content is unknown, so no grant can be justified from an ancestor.

Fields

§policy_path: String

Storage key whose read failed.

§detail: String

Backend error detail.

Implementations§

Source§

impl PolicyOutcome

Source

pub fn document(&self) -> Option<&AclDocument>

The parsed document, if one was found.

Returns None for every non-Found outcome — including the failure outcomes. Callers that feed this straight into the evaluator get deny-by-default, but they lose the distinction between “nothing governs this” and “we could not read what governs this”; prefer matching on the outcome directly, or gate on Self::is_failure first.

Source

pub fn is_failure(&self) -> bool

true for Invalid and Unavailable — the outcomes that must deny rather than inherit.

Source

pub fn may_inherit(&self) -> bool

true when the walk may legitimately fall back to an ancestor or legacy policy — i.e. only for Missing.

Source

pub fn into_result(self) -> Result<Option<AclDocument>, PodError>

Collapse to the historical Result<Option<AclDocument>, PodError> shape.

Found → Ok(Some), Missing → Ok(None), and both failure outcomes → Err. The error mapping keeps the HTTP status the bounded parsers already produced (413 for TooLarge, 400 for TooDeep) so existing callers see no status change; Malformed / NotUtf8 become PodError::AclParse and Unavailable becomes PodError::Backend.

This is a lossy but fail-closed adapter: an Err can never be mistaken for a grant. New code should match on the outcome instead.

Source

pub fn from_legacy( result: Result<Option<AclDocument>, PodError>, resource_path: &str, ) -> Self

Adapt a legacy Result<Option<AclDocument>, PodError> into a typed outcome.

Used as the default AclResolver::resolve_policy body so an existing out-of-repo implementor that only supplies find_effective_acl keeps compiling and still reports fail-closed outcomes. The mapping is the inverse of Self::into_result; it cannot recover which ancestor a legacy resolver skipped, so such an implementor should override resolve_policy to get true per-level fidelity.

Trait Implementations§

Source§

impl Clone for PolicyOutcome

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PolicyOutcome

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more