Struct Outbox
pub struct Outbox<T, O = ()> { /* private fields */ }Expand description
Outside consequences of the record’s actions, queued in the document: a
mail to send, an event to upload, a file to move. A verb that takes
&mut Outbox<T, O> pushes entries and is an Outside action.
Every replica replays the entries; only the device that owns an entry
carries it out. The framework drains the outbox there, runs the app’s
handler for each pending entry and records how it
settled, with the handler’s result O, through the
settle edit: content from outside, nobody’s undo
step. A verb reads a settlement with Self::outcome (a revert needs
to know where the trashed file went), may settle an entry itself
(Self::settle) and forgets settled entries (Self::forget,
Self::prune).
Implementations§
§impl<T, O> Outbox<T, O>
impl<T, O> Outbox<T, O>
pub fn new() -> Outbox<T, O>
pub fn push(&mut self, id: Id, value: T) -> Id
pub fn push(&mut self, id: Id, value: T) -> Id
Queue value under id (mint it with ActionCx::id). Queued by
an undo’s or a redo’s compensating action, it records the steps it
settles.
pub fn pending(&self) -> impl Iterator<Item = (&Id, &T)>
pub fn pending(&self) -> impl Iterator<Item = (&Id, &T)>
The entries the owning device has yet to run, oldest first.
pub fn entries(&self) -> impl ExactSizeIterator
pub fn entries(&self) -> impl ExactSizeIterator
Every entry, settled or not, oldest first.
pub fn get(&self, id: &Id) -> Option<&OutboxEntry<T, O>>
pub fn outcome(&self, id: &Id) -> Option<&Settled<O>>
pub fn outcome(&self, id: &Id) -> Option<&Settled<O>>
How the entry id settled; None while it is pending or when there
is no such entry.
pub fn settle(&mut self, id: &Id, outcome: Settled<O>) -> bool
pub fn settle(&mut self, id: &Id, outcome: Settled<O>) -> bool
Record how the entry id settled, from a verb. Whether there is
such an entry.
pub fn forget(&mut self, id: &Id) -> Option<OutboxEntry<T, O>>
pub fn forget(&mut self, id: &Id) -> Option<OutboxEntry<T, O>>
Forget the entry id. A pending entry forgotten is never carried
out.
pub fn prune(&mut self, keep: usize)
pub fn prune(&mut self, keep: usize)
Forget the oldest settled entries beyond the newest keep; pending
ones stay.
pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool
Trait Implementations§
§impl<T, O> Model for Outbox<T, O>
impl<T, O> Model for Outbox<T, O>
§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>
Entries are queued by verbs; an edit settles one or forgets a settled one.
§const CHECKS: bool = T::CHECKS
const CHECKS: bool = T::CHECKS
#[model(check)]
invariant; Self::check has nothing to do otherwise.§const OPS: bool = T::OPS
const OPS: bool = T::OPS
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.§type Paths<R> = Path<R, Outbox<T, O>>
type Paths<R> = Path<R, Outbox<T, O>>
R:
a struct of field paths for a record, the Path itself for a value
edited whole or through its own operations.§fn paths_at<R>(path: Path<R, Outbox<T, O>>) -> Path<R, Outbox<T, O>>
fn paths_at<R>(path: Path<R, Outbox<T, O>>) -> Path<R, Outbox<T, O>>
path.§fn from_json(value: &Value) -> Result<Outbox<T, O>, ModelError>
fn from_json(value: &Value) -> Result<Outbox<T, O>, ModelError>
Self::to_json form. Read more§fn load(
doc: &AutoCommit,
value: &Value<'_>,
id: &ExId,
) -> Result<Outbox<T, O>, ModelError>
fn load( doc: &AutoCommit, value: &Value<'_>, id: &ExId, ) -> Result<Outbox<T, O>, ModelError>
§fn missing() -> Result<Outbox<T, O>, ModelError>
fn missing() -> Result<Outbox<T, O>, ModelError>
§fn store(&self, doc: &mut AutoCommit, slot: Slot<'_>) -> Result<(), ModelError>
fn store(&self, doc: &mut AutoCommit, slot: Slot<'_>) -> 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§fn check(&self) -> Result<(), Refusal>
fn check(&self) -> Result<(), Refusal>
#[model(check)] invariant of this value and the values
inside it. Read more§fn diff<R>(
&self,
after: &Outbox<T, O>,
path: &[Segment],
out: &mut Vec<Edit<R>>,
)
fn diff<R>( &self, after: &Outbox<T, O>, 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.§const SHAPE: Shape = crate::Shape::Value
const SHAPE: Shape = crate::Shape::Value
Shape.
Types written whole keep the default.§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 nested_collections(&self) -> Vec<ItemCollection>
fn nested_collections(&self) -> Vec<ItemCollection>
#[derive(Model)] lists a
record’s, the default has none.§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 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 collect_text(&self, _out: &mut Vec<String>)
fn collect_text(&self, _out: &mut Vec<String>)
Auto Trait Implementations§
impl<T, O = ()> !Freeze for Outbox<T, O>
impl<T, O> RefUnwindSafe for Outbox<T, O>where
T: RefUnwindSafe,
O: RefUnwindSafe,
impl<T, O> Send for Outbox<T, O>
impl<T, O> Sync for Outbox<T, O>
impl<T, O> Unpin for Outbox<T, O>
impl<T, O> UnsafeUnpin for Outbox<T, O>
impl<T, O> UnwindSafe for Outbox<T, O>where
T: UnwindSafe,
O: UnwindSafe,
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> DowncastSync for T
impl<T> DowncastSync for T
§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