sz_rust_sdk/core/
config_manager.rs

1//! Core implementation of SzConfigManager trait
2
3use crate::{
4    error::SzResult,
5    ffi_call_config_mgr, process_config_mgr_long_result, process_config_mgr_result,
6    traits::{SzConfig, SzConfigManager},
7    types::{ConfigId, JsonString},
8};
9
10/// Core implementation of the SzConfigManager trait
11///
12/// This is a zero-sized type as the config manager uses module-level
13/// functions in the native library after initialization.
14pub struct SzConfigManagerCore;
15
16impl SzConfigManagerCore {
17    /// Creates a new SzConfigManagerCore without initializing the native library.
18    /// Caller must ensure SzConfigMgr_init has already been called.
19    pub(crate) fn new() -> SzResult<Self> {
20        Ok(Self)
21    }
22}
23
24impl SzConfigManager for SzConfigManagerCore {
25    fn create_config(&self) -> SzResult<Box<dyn SzConfig>> {
26        match super::environment::SzEnvironmentCore::get_existing_instance() {
27            Ok(existing_env) => {
28                let config_core = super::config::SzConfigCore::new_with_params(
29                    "SzRustSDK-Config",
30                    existing_env.get_ini_params(),
31                    existing_env.get_verbose_logging(),
32                )?;
33                Ok(Box::new(config_core))
34            }
35            Err(e) => Err(crate::error::SzError::configuration(format!(
36                "Cannot create config without initialized environment: {e}"
37            ))),
38        }
39    }
40
41    fn create_config_from_id(&self, config_id: ConfigId) -> SzResult<Box<dyn SzConfig>> {
42        let result = unsafe { crate::ffi::SzConfigMgr_getConfig_helper(config_id) };
43        let config_definition = process_config_mgr_result!(result)?;
44
45        let config_core = super::config::SzConfigCore::new_with_definition(&config_definition)?;
46        Ok(Box::new(config_core))
47    }
48
49    fn create_config_from_definition(
50        &self,
51        config_definition: &str,
52    ) -> SzResult<Box<dyn SzConfig>> {
53        let config_core = super::config::SzConfigCore::new_with_definition(config_definition)?;
54        Ok(Box::new(config_core))
55    }
56
57    fn get_config_registry(&self) -> SzResult<JsonString> {
58        let result = unsafe { crate::ffi::SzConfigMgr_getConfigRegistry_helper() };
59        process_config_mgr_result!(result)
60    }
61
62    fn get_default_config_id(&self) -> SzResult<ConfigId> {
63        let result = unsafe { crate::ffi::SzConfigMgr_getDefaultConfigID_helper() };
64        process_config_mgr_long_result!(result)
65    }
66
67    fn register_config(
68        &self,
69        config_definition: &str,
70        config_comment: Option<&str>,
71    ) -> SzResult<ConfigId> {
72        let config_def_c = crate::ffi::helpers::str_to_c_string(config_definition)?;
73        let comment_c = crate::ffi::helpers::str_to_c_string(config_comment.unwrap_or(""))?;
74
75        let result = unsafe {
76            crate::ffi::SzConfigMgr_registerConfig_helper(config_def_c.as_ptr(), comment_c.as_ptr())
77        };
78
79        process_config_mgr_long_result!(result)
80    }
81
82    fn replace_default_config_id(
83        &self,
84        current_default_config_id: ConfigId,
85        new_default_config_id: ConfigId,
86    ) -> SzResult<()> {
87        ffi_call_config_mgr!(crate::ffi::SzConfigMgr_replaceDefaultConfigID(
88            current_default_config_id,
89            new_default_config_id
90        ));
91        Ok(())
92    }
93
94    fn set_default_config(
95        &self,
96        config_definition: &str,
97        config_comment: Option<&str>,
98    ) -> SzResult<ConfigId> {
99        let config_id = self.register_config(config_definition, config_comment)?;
100        self.set_default_config_id(config_id)?;
101        Ok(config_id)
102    }
103
104    fn set_default_config_id(&self, config_id: ConfigId) -> SzResult<()> {
105        ffi_call_config_mgr!(crate::ffi::SzConfigMgr_setDefaultConfigID(config_id));
106        Ok(())
107    }
108}