Enum Expiry
pub enum Expiry {
Never,
AtUnix(u64),
EndOfSession,
AfterUse,
}Expand description
When a capability dies — the expiry of (subject, resource, verbs, expiry).
The whole lifetime vocabulary: the portal’s “Just once” / “Until I log
out” / “Always” map to Expiry::AfterUse, EndOfSession and
Never respectively, not a parallel enum.
Variants§
Never
Lives until explicitly revoked, and survives a restart.
AtUnix(u64)
Dies at this wall-clock instant (seconds since epoch); survives a restart if not yet past.
EndOfSession
Dies when the granting session ends. Never written to disk.
AfterUse
Dies as soon as the requesting prompt completes. Never written to disk.
Implementations§
§impl Expiry
impl Expiry
pub fn is_live_at(self, now: Option<u64>) -> bool
pub fn is_live_at(self, now: Option<u64>) -> bool
Is a capability with this expiry still live at now?
now: None skips time evaluation — used by the wire validator, which
shares no clock with an op’s author. EndOfSession/AfterUse are
live here; their deaths are events (not persisting, dropping after
use), not instants.
pub fn persists_across_restart(self) -> bool
pub fn persists_across_restart(self) -> bool
Should a capability with this expiry be written to disk?
The single answer to “does Always survive a restart?” — session- and
use-scoped capabilities are excluded so persisting them can’t silently
turn a one-shot grant into a permanent one.
pub fn outlives(self, other: Expiry) -> bool
pub fn outlives(self, other: Expiry) -> bool
Does a capability with this expiry outlive one with other?
Order: Never > AtUnix(later) > AtUnix(earlier) > EndOfSession >
AfterUse. An explicit deadline outranks the session because it
survives a restart.
pub fn longest(a: Expiry, b: Expiry) -> Expiry
pub fn longest(a: Expiry, b: Expiry) -> Expiry
The longer-lived of two expiries — the single definition of “strongest scope wins”, used both merging a re-grant and reporting an existing grant’s strength. Two answers here would eventually disagree, reading as a permanent grant silently becoming a session one.
Trait Implementations§
§impl<'de> Deserialize<'de> for Expiry
impl<'de> Deserialize<'de> for Expiry
§fn deserialize<__D>(
__deserializer: __D,
) -> Result<Expiry, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<Expiry, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
§impl Model for Expiry
impl Model for Expiry
§const CHECKS: bool
const CHECKS: bool
#[model(check)]
invariant; Self::check has nothing to do otherwise.§type Paths<__R> = Path<__R, Expiry>
type Paths<__R> = Path<__R, Expiry>
R:
a struct of field paths for a record, the Path itself for a value
edited whole or through its own operations.§fn from_json(value: &Value) -> Result<Expiry, ModelError>
fn from_json(value: &Value) -> Result<Expiry, ModelError>
Self::to_json form. Read more§fn load(
doc: &AutoCommit,
value: &Value<'_>,
id: &ExId,
) -> Result<Expiry, ModelError>
fn load( doc: &AutoCommit, value: &Value<'_>, id: &ExId, ) -> Result<Expiry, ModelError>
§fn missing() -> Result<Expiry, ModelError>
fn missing() -> Result<Expiry, ModelError>
§fn store(&self, doc: &mut AutoCommit, slot: Slot<'_>) -> Result<(), ModelError>
fn store(&self, doc: &mut AutoCommit, slot: Slot<'_>) -> Result<(), ModelError>
self into slot, changing only what differs from what the slot
already holds.§fn value_schema() -> Value
fn value_schema() -> Value
Self::to_json), as
the published field edit describes what a path takes; the default
accepts any value.§fn field_type(types: &mut TypeSet) -> FieldType
fn field_type(types: &mut TypeSet) -> FieldType
FieldType), declaring the records
and enums it names in types. The default describes no type: any
value.§fn check(&self) -> Result<(), Refusal>
fn check(&self) -> Result<(), Refusal>
#[model(check)] invariant of this value and the values
inside it.§fn collect_text(&self, out: &mut Vec<String>)
fn collect_text(&self, out: &mut Vec<String>)
§const SHAPE: Shape = crate::Shape::Value
const SHAPE: Shape = crate::Shape::Value
Shape.
Types written whole keep the default.§const OPS: bool = false
const OPS: bool = false
Operations, rich text’s): a record routes
those edits’ gestures, landing places and schemas only into such
fields, and never instantiates the routing for the others.§const NULLABLE: bool = false
const NULLABLE: bool = false
null is a value of the type: an absent Option. A field
edit setting any other type to null is refused.§const TABLE: &'static ModelTable = _
const TABLE: &'static ModelTable = _
crate::table]): by default its own functions, erased.§fn edit(
doc: &mut AutoCommit,
slot: Slot<'_>,
path: &[Segment],
op: &EditOp,
cx: &mut ActionCx,
) -> Result<(), ModelError>
fn edit( doc: &mut AutoCommit, slot: Slot<'_>, path: &[Segment], op: &EditOp, cx: &mut ActionCx, ) -> Result<(), ModelError>
op at path, below the value in slot,
touching only what it changes, then run the invariants of the values
it touched. The default edits a value only as a whole.§fn diff<R>(&self, after: &Self, path: &[Segment], out: &mut Vec<Edit<R>>)
fn diff<R>(&self, after: &Self, path: &[Segment], out: &mut Vec<Edit<R>>)
self into after, at path below the
record: what a surface that edited a local copy submits. The default
sets the value whole when it changed; containers and records edit
only what differs, item by item and field by field. A value that
would store as it is (Self::stores_as) is compared in memory,
without turning either side into JSON.§fn nested_collections(&self) -> Vec<ItemCollection>
fn nested_collections(&self) -> Vec<ItemCollection>
#[derive(Model)] lists a
record’s, the default has none.§fn read_whole(&mut self, doc: &AutoCommit) -> Result<(), ModelError>
fn read_whole(&mut self, doc: &AutoCommit) -> Result<(), ModelError>
#[model(whole)]: a value read lazily (rich text reads its
paragraphs as views ask for them) reads all of it, so every reader of
the record — a verb, search, read_content — sees all of it. The
default has nothing more to read. Read more§fn label(&self) -> Option<String>
fn label(&self) -> Option<String>
#[model(label)]): history, search,
agents and item resources use it.§fn op_coalesces(
path: &[Segment],
previous: &Value,
next: &Value,
) -> Option<bool>
fn op_coalesces( path: &[Segment], previous: &Value, next: &Value, ) -> Option<bool>
path below
this type are one gesture (Operations); None
when nothing there has one.§fn op_continuable(path: &[Segment], op: &Value) -> Option<bool>
fn op_continuable(path: &[Segment], op: &Value) -> Option<bool>
op at path.§fn op_describe(path: &[Segment], op: &Value) -> Option<OpDescription>
fn op_describe(path: &[Segment], op: &Value) -> Option<OpDescription>
§fn op_lands(&self, path: &[Segment], op: &Value) -> Option<Place>
fn op_lands(&self, path: &[Segment], op: &Value) -> Option<Place>
op at path below this value is after
it applied.§fn op_schemas(prefix: &str, out: &mut Vec<(String, Value)>)
fn op_schemas(prefix: &str, out: &mut Vec<(String, Value)>)
prefix (* for every item).§fn get_at(&self, path: &[Segment]) -> Option<&(dyn Any + 'static)>where
Self: 'static,
fn get_at(&self, path: &[Segment]) -> Option<&(dyn Any + 'static)>where
Self: 'static,
path below this one, if it is there. A value with
nothing inside it is found only at the empty path.§fn stores_as(&self, before: &Self) -> bool
fn stores_as(&self, before: &Self) -> bool
self over a slot that holds before, as a
store left it, would change nothing: an in-memory
comparison, so an action that changed one item of a long collection
does not visit the others. Must only answer true when store would
write no operation; the default answers false (unknown).§fn store_changed(
&self,
before: &Self,
doc: &mut AutoCommit,
slot: Slot<'_>,
dirty: &Delta,
) -> Result<(), ModelError>
fn store_changed( &self, before: &Self, doc: &mut AutoCommit, slot: Slot<'_>, dirty: &Delta, ) -> Result<(), ModelError>
§fn refresh(
&mut self,
doc: &AutoCommit,
value: &Value<'_>,
id: &ExId,
delta: &Delta,
) -> Result<(), ModelError>
fn refresh( &mut self, doc: &AutoCommit, value: &Value<'_>, id: &ExId, delta: &Delta, ) -> Result<(), ModelError>
delta,
re-reading only what they touched. value and id are what the
parent’s slot holds now — the same object as when self was read, or
the parent would have read it anew. The default reads the value again,
which is right for scalars and short values. Read more§impl Serialize for Expiry
impl Serialize for Expiry
§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl Copy for Expiry
impl Eq for Expiry
impl Settable for Expiry
impl StructuralPartialEq for Expiry
Auto Trait Implementations§
impl Freeze for Expiry
impl RefUnwindSafe for Expiry
impl Send for Expiry
impl Sync for Expiry
impl Unpin for Expiry
impl UnsafeUnpin for Expiry
impl UnwindSafe for Expiry
Blanket Implementations§
§impl<T> AnyEq for T
impl<T> AnyEq for T
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,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more