Skip to main content

crux_core/capability/
mod.rs

1#[cfg(feature = "facet_typegen")]
2use crate::type_generation::facet::TypeGenError;
3
4/// Operation trait links together input and output of a side-effect.
5///
6/// You implement `Operation` on the payload sent by the capability to the shell using [`CapabilityContext::request_from_shell`].
7///
8/// For example (from `crux_http`):
9///
10/// ```rust,ignore
11/// impl Operation for HttpRequest {
12///     type Output = HttpResponse;
13/// }
14/// ```
15pub trait Operation: Send + 'static {
16    /// `Output` assigns the type this request results in.
17    type Output: Send + Unpin + 'static;
18
19    #[cfg(feature = "typegen")]
20    #[allow(clippy::missing_errors_doc)]
21    fn register_types(
22        generator: &mut crate::type_generation::serde::TypeGen,
23    ) -> crate::type_generation::serde::Result
24    where
25        Self: serde::Serialize + for<'de> serde::de::Deserialize<'de>,
26        Self::Output: for<'de> serde::de::Deserialize<'de>,
27    {
28        generator.register_type::<Self>()?;
29        generator.register_type::<Self::Output>()?;
30        Ok(())
31    }
32
33    #[cfg(feature = "facet_typegen")]
34    #[allow(clippy::missing_errors_doc)]
35    fn register_types_facet<'a>(
36        generator: &mut crate::type_generation::facet::TypeRegistry,
37    ) -> Result<&mut crate::type_generation::facet::TypeRegistry, TypeGenError>
38    where
39        Self: facet::Facet<'a> + serde::Serialize + for<'de> serde::de::Deserialize<'de>,
40        <Self as Operation>::Output: facet::Facet<'a> + for<'de> serde::de::Deserialize<'de>,
41    {
42        generator
43            .register_type::<Self>()
44            .map_err(|e| TypeGenError::Generation(e.to_string()))?
45            .register_type::<Self::Output>()
46            .map_err(|e| TypeGenError::Generation(e.to_string()))?;
47
48        Ok(generator)
49    }
50}