sz_rust_sdk/core/
config.rs

1//! Core implementation of SzConfig trait
2
3use crate::{
4    error::SzResult, ffi_call_config, process_config_result, traits::SzConfig, types::JsonString,
5};
6
7/// Config handle type (matches C uintptr_t)
8type ConfigHandle = usize;
9
10/// Core implementation of the SzConfig trait
11pub struct SzConfigCore {
12    handle: ConfigHandle,
13}
14
15// SAFETY: SzConfigCore is safe to send between threads as the handle is managed by Senzing
16unsafe 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                // SzConfig_load_helper returns *mut c_void, cast to usize for our handle
68                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}