vine_core/core/
bean_def.rs1use 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}