pub struct Interactor<'l, Storage, Action, Context, Output> { /* private fields */ }Expand description
The interface all modifications of the game state go through.
Game state modification is deferred by default. Each change in queued until the end of the function, or Interactor::flush is called. This means all reads will not see any changes made after the last flush, if any. Multiple changes can be queued to the same item between flush points, and they will be applied in the order they were queued.
Use Interactor::create to create new items, and Interactor::get to storage existing items. You can queue updates in either case using Pending::update or Existing::update, respectively. With an Existing item, you can read the state of the item by dereferencing it, and use Existing::destroy to destroy it.
Interactors are used in game::Init, player::Init,
Interaction, and Reaction. Depending on the usage,
an Interactor will have different Context available. For example, in
most cases, the Context will contain the game Root, but in game::Init,
it does not, as the Root has not yet been created.
Interactors may also have additional optional outputs, depending on the kind. Interactions and Reactions may use Interactor::enqueue_trigger to enqueue Reaction::Triggers, which will start a new Reaction on the server once dequeued. Reactions can also end the game by Interactor::set_game_outcome.
All changes made with an Interactor are transactional: if an error occurs, there is no need to undo any changes you made (even if flushed), just return an error. The changes from that Interactor and all the preceding triggering Interactors will be reverted automatically.
Implementations§
Source§impl<'l, Storage, Action, Context, Output> Interactor<'l, Storage, Action, Context, Output>
impl<'l, Storage, Action, Context, Output> Interactor<'l, Storage, Action, Context, Output>
Sourcepub fn create<Create>(
&self,
create: Create,
) -> Pending<'_, Storage, Action, Create::T>
pub fn create<Create>( &self, create: Create, ) -> Pending<'_, Storage, Action, Create::T>
Create a new item. See action::Create.
As changes are deferred, this method returns a Pending item, which can make updates, but cannot read the item state, as it does not exist until Interactor::flush is called.
Sourcepub fn get<T>(&self, id: IdT<T>) -> Result<Existing<'_, Storage, Action, T>>
pub fn get<T>(&self, id: IdT<T>) -> Result<Existing<'_, Storage, Action, T>>
Storage an existing item by id. Returns an error if the item does not exist.
Sourcepub fn root(&self) -> &Context::Rootwhere
Context: GetRoot,
pub fn root(&self) -> &Context::Rootwhere
Context: GetRoot,
Gets the Common::Root object.
Sourcepub fn get_root<Root>(&self) -> Result<Existing<'_, Storage, Action, Root>>
pub fn get_root<Root>(&self) -> Result<Existing<'_, Storage, Action, Root>>
If the Common::Root object is an IdT, gets that item.
Equivalent to self.get(self.root()).
Sourcepub fn enqueue_trigger(&self, trigger: Output::Trigger)where
Output: EnqueueTrigger,
pub fn enqueue_trigger(&self, trigger: Output::Trigger)where
Output: EnqueueTrigger,
Enqueues a Reaction with the given Reaction::Trigger.
Triggers are processed FIFO, after an Interaction or Reaction completes, until the queue is emptied. This means infinite loops are possible if Reactions keep enqueuing more Reactions.
Triggers are only executed server-side, and are ignored on the client. If the Reactions are successful, the clients will be updated with the outcomes of the Reactions. If a Reaction errors, all Reactions and the initial Interaction (if any) will be reverted, and the resulting game state will be as if they never happened.
Sourcepub fn set_game_outcome(&self, game_outcome: Output::GameOutcome)where
Output: SetGameOutcome,
pub fn set_game_outcome(&self, game_outcome: Output::GameOutcome)where
Output: SetGameOutcome,
Sets the game outcome. Once Reactions complete successfully, the game will end, and clients will be notified of the outcome. If this is called multiple times, the last outcome set will be used. If the transaction fails, the game will not end.
Sourcepub fn flush(&mut self) -> Result<()>
pub fn flush(&mut self) -> Result<()>
Flushes all pending changes to the game state.
Avoid calling this method unless necessary, as it requires exclusive access to the Interactor and is only needed when the updated state of an item needs to be read. It is not necessary to flush at the end of the function, this will be done automatically.
Flush will direct all operations to the item::Storage implementation, which means this may have side effects such as engine events (e.g. entity creation) being triggered. As the Interactor could still fail, this could result in spurious events as the changes are done and undone.
Trait Implementations§
Auto Trait Implementations§
impl<'l, Storage, Action, Context, Output> !Freeze for Interactor<'l, Storage, Action, Context, Output>
impl<'l, Storage, Action, Context, Output> !RefUnwindSafe for Interactor<'l, Storage, Action, Context, Output>
impl<'l, Storage, Action, Context, Output> Send for Interactor<'l, Storage, Action, Context, Output>
impl<'l, Storage, Action, Context, Output> !Sync for Interactor<'l, Storage, Action, Context, Output>
impl<'l, Storage, Action, Context, Output> Unpin for Interactor<'l, Storage, Action, Context, Output>
impl<'l, Storage, Action, Context, Output> !UnwindSafe for Interactor<'l, Storage, Action, Context, Output>
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> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.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> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.