scf_core/property/
mod.rs

1use std::any::TypeId;
2
3use lang_extension::any::*;
4use lang_extension::convert::*;
5use lang_extension::ops::function::*;
6
7use crate::source::*;
8
9pub mod default;
10
11pub trait RawPropertyConfig: Key + Send + Sync {
12    /// a unique key in a configuration manager to identify a unique property,
13    fn get_raw_key(&self) -> Box<dyn Key>;
14
15    /// type of the property value,
16    fn get_value_type(&self) -> TypeId;
17
18    /// default value of the property
19    ///
20    /// default to None
21    fn get_raw_default_value(&self) -> Option<Box<dyn Value>>;
22
23    /// type converters used to convert values of different types,
24    /// for example, some configuration source has string value,
25    /// but integer is needed, so it's necessary to provide a string-to-int converter
26    ///
27    /// default to empty Vec
28    fn get_value_converters(&self) -> &[Box<dyn RawTypeConverter>];
29
30    /// a chance for the user to check the value before using a property value provided by a configuration source,
31    /// filter input is non-null, if output is null, the value will be ignored,
32    /// if output is non-None, output will be used as the property value
33    ///
34    /// default to None
35    fn get_value_filter(&self) -> Option<&dyn RawValueFilter>;
36
37    /// get property description document
38    /// default to None
39    fn get_doc(&self) -> Option<&str>;
40
41    /// whether the property is static (not dynamically changeable)
42    ///
43    /// default to false
44    fn is_static(&self) -> bool;
45
46    /// whether the property is required (must be configured or have a default value)
47    ///
48    /// default to false
49    fn is_required(&self) -> bool;
50
51    as_boxed!(RawPropertyConfig);
52    as_trait!(RawPropertyConfig);
53}
54
55boxed_key_trait!(RawPropertyConfig);
56
57pub trait RawProperty: Value + Send + Sync {
58    fn get_raw_config(&self) -> &dyn RawPropertyConfig;
59
60    /// property value, if not configured or no valid value, default to defaultValue Of PropertyConfig
61    fn get_raw_value(&self) -> Option<Box<dyn Value>>;
62
63    /// which configuration source is actually used
64    /// return None if using default value
65    fn get_source(&self) -> Option<Box<dyn ConfigurationSource>>;
66
67    /// listeners to the value change, notified once value changed
68    fn add_raw_change_listener(&self, listener: RawPropertyChangeListener);
69
70    as_boxed!(RawProperty);
71    as_trait!(RawProperty);
72}
73
74boxed_value_trait!(RawProperty);
75
76pub trait RawPropertyChangeEvent: Value + Send + Sync {
77    fn get_raw_property(&self) -> &dyn RawProperty;
78
79    fn get_raw_old_value(&self) -> Option<Box<dyn Value>>;
80
81    fn get_raw_new_value(&self) -> Option<Box<dyn Value>>;
82
83    fn get_change_time(&self) -> u128;
84
85    as_boxed!(RawPropertyChangeEvent);
86    as_trait!(RawPropertyChangeEvent);
87}
88
89boxed_value_trait!(RawPropertyChangeEvent);
90
91pub type RawPropertyChangeListener = ConsumerRef<dyn RawPropertyChangeEvent>;
92
93pub trait PropertyConfig<K: ?Sized + KeyConstraint, V: ?Sized + ValueConstraint>:
94    RawPropertyConfig
95{
96    /// a unique key in a configuration manager to identify a unique property,
97    fn get_key(&self) -> Box<K>;
98
99    /// default value of the property
100    ///
101    /// default to None
102    fn get_default_value(&self) -> Option<Box<V>>;
103
104    as_boxed!(PropertyConfig<K, V>);
105}
106
107boxed_key_trait!(PropertyConfig<K: ?Sized + KeyConstraint, V: ?Sized + ValueConstraint>);
108
109pub trait PropertyConfigBuilder<K: ?Sized + KeyConstraint, V: ?Sized + ValueConstraint> {
110    /// required
111    fn set_key(&mut self, key: Box<K>) -> &mut dyn PropertyConfigBuilder<K, V>;
112
113    /// optional
114    fn set_default_value(&mut self, default_value: Box<V>) -> &mut dyn PropertyConfigBuilder<K, V>;
115
116    /// optional
117    fn add_value_converter(
118        &mut self,
119        value_converter: Box<dyn RawTypeConverter>,
120    ) -> &mut dyn PropertyConfigBuilder<K, V>;
121
122    /// optional
123    fn add_value_converters(
124        &mut self,
125        value_converters: Vec<Box<dyn RawTypeConverter>>,
126    ) -> &mut dyn PropertyConfigBuilder<K, V>;
127
128    /// optional
129    fn set_value_filter(
130        &mut self,
131        value_filter: Box<dyn ValueFilter<V>>,
132    ) -> &mut dyn PropertyConfigBuilder<K, V>;
133
134    /// optional
135    fn set_doc(&mut self, doc: &str) -> &mut dyn PropertyConfigBuilder<K, V>;
136
137    /// optional
138    fn set_static(&mut self, is_static: bool) -> &mut dyn PropertyConfigBuilder<K, V>;
139
140    /// optional
141    fn set_required(&mut self, required: bool) -> &mut dyn PropertyConfigBuilder<K, V>;
142
143    fn build(&self) -> Box<dyn PropertyConfig<K, V>>;
144}
145
146pub trait Property<K: ?Sized + KeyConstraint, V: ?Sized + ValueConstraint>: RawProperty {
147    fn get_config(&self) -> &dyn PropertyConfig<K, V>;
148
149    /// property value, if not configured or no valid value, default to defaultValue Of PropertyConfig
150    fn get_value(&self) -> Option<Box<V>>;
151
152    /// listeners to the value change, notified once value changed
153    fn add_change_listener(&self, listener: PropertyChangeListener<K, V>);
154
155    as_boxed!(Property<K, V>);
156}
157
158boxed_value_trait!(Property<K: ?Sized + KeyConstraint, V: ?Sized + ValueConstraint>);
159
160pub trait PropertyChangeEvent<K: ?Sized + KeyConstraint, V: ?Sized + ValueConstraint>:
161    RawPropertyChangeEvent
162{
163    fn get_property(&self) -> &dyn Property<K, V>;
164
165    fn get_old_value(&self) -> Option<Box<V>>;
166
167    fn get_new_value(&self) -> Option<Box<V>>;
168
169    as_boxed!(PropertyChangeEvent<K, V>);
170}
171
172boxed_value_trait!(PropertyChangeEvent<K: ?Sized + KeyConstraint, V: ?Sized + ValueConstraint>);
173
174pub type PropertyChangeListener<K, V> = ConsumerRef<dyn PropertyChangeEvent<K, V>>;