sz_rust_sdk/core/
config.rs1use crate::{
4 error::SzResult, ffi_call_config, process_config_result, traits::SzConfig, types::JsonString,
5};
6
7type ConfigHandle = usize;
9
10pub struct SzConfigCore {
12 handle: ConfigHandle,
13}
14
15unsafe impl Send for SzConfigCore {}
17unsafe impl Sync for SzConfigCore {}
18
19impl SzConfigCore {
20 pub fn new_with_params(
21 module_name: &str,
22 ini_params: &str,
23 verbose_logging: bool,
24 ) -> SzResult<Self> {
25 let module_name_c = crate::ffi::helpers::str_to_c_string(module_name)?;
26 let ini_params_c = crate::ffi::helpers::str_to_c_string(ini_params)?;
27 let verbose = if verbose_logging { 1 } else { 0 };
28
29 ffi_call_config!(crate::ffi::SzConfig_init(
30 module_name_c.as_ptr(),
31 ini_params_c.as_ptr(),
32 verbose
33 ));
34
35 let result = unsafe { crate::ffi::SzConfig_create_helper() };
36 if result.returnCode != 0 {
37 crate::ffi::helpers::check_config_return_code(result.returnCode)?;
38 }
39 let handle = result.response;
40
41 Ok(Self { handle })
42 }
43
44 pub fn new_with_definition(config_definition: &str) -> SzResult<Self> {
45 match super::environment::SzEnvironmentCore::get_existing_instance() {
46 Ok(existing_env) => {
47 let module_name_c = crate::ffi::helpers::str_to_c_string("SzRustSDK-Config")?;
48 let ini_params_c =
49 crate::ffi::helpers::str_to_c_string(existing_env.get_ini_params())?;
50 let verbose = if existing_env.get_verbose_logging() {
51 1
52 } else {
53 0
54 };
55
56 ffi_call_config!(crate::ffi::SzConfig_init(
57 module_name_c.as_ptr(),
58 ini_params_c.as_ptr(),
59 verbose
60 ));
61
62 let config_def_c = crate::ffi::helpers::str_to_c_string(config_definition)?;
63 let result = unsafe { crate::ffi::SzConfig_load_helper(config_def_c.as_ptr()) };
64 if result.returnCode != 0 {
65 crate::ffi::helpers::check_config_return_code(result.returnCode)?;
66 }
67 let handle = result.response as usize;
69
70 Ok(Self { handle })
71 }
72 Err(e) => Err(crate::error::SzError::configuration(format!(
73 "Cannot create config with definition without initialized environment: {e}"
74 ))),
75 }
76 }
77}
78
79impl SzConfig for SzConfigCore {
80 fn export(&self) -> SzResult<JsonString> {
81 let result = unsafe { crate::ffi::SzConfig_export_helper(self.handle) };
82 process_config_result!(result)
83 }
84
85 fn get_data_source_registry(&self) -> SzResult<JsonString> {
86 let result = unsafe { crate::ffi::SzConfig_getDataSourceRegistry_helper(self.handle) };
87 process_config_result!(result)
88 }
89
90 fn register_data_source(&self, data_source_code: &str) -> SzResult<JsonString> {
91 let json_input = format!(r#"{{"DSRC_CODE": "{data_source_code}"}}"#);
92 let data_source_c = crate::ffi::helpers::str_to_c_string(&json_input)?;
93
94 let result = unsafe {
95 crate::ffi::SzConfig_registerDataSource_helper(self.handle, data_source_c.as_ptr())
96 };
97
98 process_config_result!(result)
99 }
100
101 fn unregister_data_source(&self, data_source_code: &str) -> SzResult<()> {
102 let json_input = format!(r#"{{"DSRC_CODE": "{data_source_code}"}}"#);
103 let data_source_c = crate::ffi::helpers::str_to_c_string(&json_input)?;
104
105 ffi_call_config!(crate::ffi::SzConfig_unregisterDataSource_helper(
106 self.handle,
107 data_source_c.as_ptr()
108 ));
109
110 Ok(())
111 }
112}
113
114impl Drop for SzConfigCore {
115 fn drop(&mut self) {
116 if self.handle != 0 {
117 unsafe {
118 let _ = crate::ffi::SzConfig_close_helper(self.handle);
119 }
120 }
121 }
122}