crux_core/core/
resolve.rs1use thiserror::Error;
2
3use crate::bridge::EffectId;
4
5type ResolveOnce<Out> = Box<dyn FnOnce(Out) + Send>;
8type ResolveMany<Out> = Box<dyn Fn(Out) -> Result<(), ()> + Send>;
9
10pub enum RequestHandle<Out> {
13 Never,
14 Once(ResolveOnce<Out>),
15 Many(ResolveMany<Out>),
16}
17pub trait Resolvable<Output> {
20 fn resolve(&mut self, output: Output) -> Result<(), ResolveError>;
24}
25
26impl<Output> Resolvable<Output> for RequestHandle<Output> {
27 fn resolve(&mut self, output: Output) -> Result<(), ResolveError> {
28 self.resolve(output)
29 }
30}
31
32impl<Output> RequestHandle<Output> {
33 pub fn resolve(&mut self, output: Output) -> Result<(), ResolveError> {
37 match self {
38 RequestHandle::Never => Err(ResolveError::Never),
39 RequestHandle::Many(f) => f(output).map_err(|()| ResolveError::FinishedMany),
40 RequestHandle::Once(_) => {
41 if let RequestHandle::Once(f) = std::mem::replace(self, RequestHandle::Never) {
43 f(output);
44 }
45
46 Ok(())
47 }
48 }
49 }
50}
51
52#[derive(Error, Debug)]
53pub enum ResolveError {
54 #[error("Attempted to resolve a request that is not expected to be resolved.")]
55 Never,
56 #[error("Attempted to resolve a request that has concluded.")]
57 FinishedMany,
58 #[error("Request with {0:?} not found.")]
59 NotFound(EffectId), }