44//! the result anywhere (Aquila, a file, ...) is a transport concern that
55//! belongs to the caller.
66
7+ use std:: collections:: HashSet ;
8+
9+ use code0_flow:: flow_config:: env_with_default;
10+ use code0_flow:: flow_config:: environment:: Environment ;
11+
712use crate :: meta:: {
8- DataTypeMeta , DataTypeRegistration , MetaRegistration , ModuleMeta , ModuleRegistration ,
9- RuntimeFunctionMeta ,
13+ DataTypeMeta , DataTypeRegistration , FlowTypeMeta , FlowTypeRegistration , MetaRegistration ,
14+ ModuleMeta , ModuleRegistration , RuntimeFunctionMeta ,
1015} ;
1116use tucana:: shared:: {
12- DefinitionDataType , FunctionDefinition , Module , ParameterDefinition , RuntimeFunctionDefinition ,
13- RuntimeParameterDefinition ,
17+ DefinitionDataType , FlowType , FunctionDefinition , Module , ParameterDefinition ,
18+ RuntimeFlowType , RuntimeFunctionDefinition , RuntimeParameterDefinition ,
1419} ;
1520
16- /// Builds every registered module, complete with its function and data-type
17- /// definitions. Panics if a function or data type declares a `module` that
21+ /// Builds every registered module, complete with its function, data-type and
22+ /// flow-type definitions. Skips modules declared `dev_only` unless Taurus is
23+ /// running with `ENVIRONMENT=development` (the default), along with anything
24+ /// that declares one of those modules as its owner.
25+ ///
26+ /// Panics if a function, data type, or flow type declares a `module` that
1827/// has no matching `taurus_macros::module!` registration -- a broken link
1928/// between a handler and its owning module is a programming error, not a
20- /// runtime condition to recover from.
29+ /// runtime condition to recover from. This does not apply to modules that
30+ /// were themselves excluded for being `dev_only`.
2131pub fn build_modules ( ) -> Vec < Module > {
32+ let is_dev = env_with_default ( "ENVIRONMENT" , Environment :: Development ) == Environment :: Development ;
33+
34+ let mut excluded: HashSet < & ' static str > = HashSet :: new ( ) ;
2235 let mut modules: Vec < Module > = inventory:: iter :: < ModuleRegistration > ( )
23- . map ( |reg| module_from_meta ( ( reg. 0 ) ( ) ) )
36+ . map ( |reg| ( reg. 0 ) ( ) )
37+ . filter_map ( |meta| {
38+ if meta. dev_only && !is_dev {
39+ excluded. insert ( meta. identifier ) ;
40+ None
41+ } else {
42+ Some ( module_from_meta ( meta) )
43+ }
44+ } )
2445 . collect ( ) ;
2546
2647 for reg in inventory:: iter :: < MetaRegistration > ( ) {
2748 let meta = ( reg. 0 ) ( ) ;
49+ if excluded. contains ( meta. module ) {
50+ continue ;
51+ }
2852 let module = find_module ( & mut modules, meta. module , meta. identifier ) ;
2953 let version = module. version . clone ( ) ;
3054 module
@@ -37,13 +61,29 @@ pub fn build_modules() -> Vec<Module> {
3761
3862 for reg in inventory:: iter :: < DataTypeRegistration > ( ) {
3963 let meta = ( reg. 0 ) ( ) ;
64+ if excluded. contains ( meta. module ) {
65+ continue ;
66+ }
4067 let module = find_module ( & mut modules, meta. module , meta. identifier ) ;
4168 let version = module. version . clone ( ) ;
4269 module
4370 . definition_data_types
4471 . push ( data_type_definition ( & meta, version) ) ;
4572 }
4673
74+ for reg in inventory:: iter :: < FlowTypeRegistration > ( ) {
75+ let meta = ( reg. 0 ) ( ) ;
76+ if excluded. contains ( meta. module ) {
77+ continue ;
78+ }
79+ let module = find_module ( & mut modules, meta. module , meta. identifier ) ;
80+ let version = module. version . clone ( ) ;
81+ module
82+ . runtime_flow_types
83+ . push ( runtime_flow_type_definition ( & meta, version. clone ( ) ) ) ;
84+ module. flow_types . push ( flow_type_definition ( & meta, version) ) ;
85+ }
86+
4787 modules
4888}
4989
@@ -148,6 +188,51 @@ fn function_definition(meta: &RuntimeFunctionMeta, version: String) -> FunctionD
148188 }
149189}
150190
191+ fn flow_type_definition ( meta : & FlowTypeMeta , version : String ) -> FlowType {
192+ FlowType {
193+ identifier : meta. identifier . to_string ( ) ,
194+ settings : Vec :: new ( ) ,
195+ editable : meta. editable ,
196+ name : meta. name . clone ( ) ,
197+ description : meta. description . clone ( ) ,
198+ documentation : meta. documentation . clone ( ) ,
199+ display_message : meta. display_message . clone ( ) ,
200+ alias : meta. alias . clone ( ) ,
201+ version,
202+ display_icon : meta. display_icon . unwrap_or_default ( ) . to_string ( ) ,
203+ definition_source : None ,
204+ linked_data_type_identifiers : meta
205+ . linked_data_type_identifiers
206+ . iter ( )
207+ . map ( |s| s. to_string ( ) )
208+ . collect ( ) ,
209+ signature : meta. signature . to_string ( ) ,
210+ runtime_identifier : meta. identifier . to_string ( ) ,
211+ }
212+ }
213+
214+ fn runtime_flow_type_definition ( meta : & FlowTypeMeta , version : String ) -> RuntimeFlowType {
215+ RuntimeFlowType {
216+ identifier : meta. identifier . to_string ( ) ,
217+ runtime_settings : Vec :: new ( ) ,
218+ editable : meta. editable ,
219+ name : meta. name . clone ( ) ,
220+ description : meta. description . clone ( ) ,
221+ documentation : meta. documentation . clone ( ) ,
222+ display_message : meta. display_message . clone ( ) ,
223+ alias : meta. alias . clone ( ) ,
224+ version,
225+ display_icon : meta. display_icon . unwrap_or_default ( ) . to_string ( ) ,
226+ definition_source : None ,
227+ linked_data_type_identifiers : meta
228+ . linked_data_type_identifiers
229+ . iter ( )
230+ . map ( |s| s. to_string ( ) )
231+ . collect ( ) ,
232+ signature : meta. signature . to_string ( ) ,
233+ }
234+ }
235+
151236fn data_type_definition ( meta : & DataTypeMeta , version : String ) -> DefinitionDataType {
152237 DefinitionDataType {
153238 identifier : meta. identifier . to_string ( ) ,
0 commit comments