vine_core/core/
bean_def.rs

1use std::fmt::{Display, Formatter};
2use std::sync::Arc;
3
4use log::trace;
5
6use crate::context::context::Context;
7use crate::core::{DynBean, Error};
8use crate::core::ty::Type;
9
10pub struct BeanDef {
11    name: String,
12    ty: Arc<Type>,
13    get_fn: Arc<dyn Fn(&Context) -> Result<DynBean, Error> + Send + Sync>,
14}
15
16pub struct BeanDefBuilder {
17    name: Option<String>,
18    ty: Option<Arc<Type>>,
19    get_fn: Option<Arc<dyn Fn(&Context) -> Result<DynBean, Error> + Send + Sync>>,
20}
21
22impl BeanDef {
23    pub fn builder() -> BeanDefBuilder {
24        BeanDefBuilder {
25            name: None,
26            ty: None,
27            get_fn: None,
28        }
29    }
30
31    pub fn name(&self) -> &str {
32        &self.name
33    }
34
35    pub fn ty(&self) -> &Arc<Type> {
36        &self.ty
37    }
38
39    pub fn get(&self, context: &Context) -> Result<(String, DynBean), Error> {
40        let name = self.name().to_string();
41        trace!("getting Bean(name={}, type={}) with {}", &name, self.ty.name(), context);
42        let dyn_bean = self.get_fn.as_ref()(context)?;
43        Ok((name, dyn_bean))
44    }
45}
46
47impl Display for BeanDef {
48    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
49        write!(f, "BeanDef(name={}, type={})", &self.name, &self.ty.name())
50    }
51}
52
53
54impl BeanDefBuilder {
55    pub fn name(mut self, name: &str) -> Self {
56        self.name = Some(name.to_string());
57        self
58    }
59
60    pub fn ty(mut self, ty: Arc<Type>) -> Self {
61        self.ty = Some(ty);
62        self
63    }
64
65    pub fn get(mut self, get_fn: Arc<dyn Fn(&Context) -> Result<DynBean, Error> + Send + Sync>) -> Self {
66        self.get_fn = Some(get_fn);
67        self
68    }
69
70    pub fn build(self) -> BeanDef {
71        let ty = self.ty.unwrap();
72        let get_fn = self.get_fn.unwrap();
73        let name = match self.name {
74            None => ty.name().to_string(),
75            Some(name) => name,
76        };
77
78        BeanDef { name, ty, get_fn, }
79    }
80}