teo_runtime/interface/
decorator.rs

1use std::sync::Arc;
2use educe::Educe;
3use serde::Serialize;
4use crate::arguments::Arguments;
5use teo_result::Result;
6use crate::interface;
7
8pub trait Call: Send + Sync {
9    fn call(&self, args: Arguments, interface: &interface::Builder) -> Result<()>;
10}
11
12impl<F> Call for F where
13    F: Fn(Arguments, &interface::Builder) -> Result<()> + Sync + Send {
14    fn call(&self, args: Arguments, interface: &interface::Builder) -> Result<()> {
15        self(args, interface)
16    }
17}
18
19#[derive(Educe)]
20#[educe(Debug)]
21#[derive(Serialize, Clone)]
22pub struct Decorator {
23    pub path: Vec<String>,
24    #[serde(skip)] #[educe(Debug(ignore))]
25    pub(crate) call: Arc<dyn Call>,
26}
27
28impl Decorator {
29
30    pub fn new<T>(path: Vec<String>, call: T) -> Self where T: Call + 'static {
31        Self {
32            path,
33            call: Arc::new(call),
34        }
35    }
36
37    pub fn path(&self) -> &Vec<String> {
38        &self.path
39    }
40
41    pub fn call(&self) -> &dyn Call {
42        self.call.as_ref()
43    }
44}