teo_runtime/interface/
decorator.rs1use 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}