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 fn get_raw_key(&self) -> Box<dyn Key>;
14
15 fn get_value_type(&self) -> TypeId;
17
18 fn get_raw_default_value(&self) -> Option<Box<dyn Value>>;
22
23 fn get_value_converters(&self) -> &[Box<dyn RawTypeConverter>];
29
30 fn get_value_filter(&self) -> Option<&dyn RawValueFilter>;
36
37 fn get_doc(&self) -> Option<&str>;
40
41 fn is_static(&self) -> bool;
45
46 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 fn get_raw_value(&self) -> Option<Box<dyn Value>>;
62
63 fn get_source(&self) -> Option<Box<dyn ConfigurationSource>>;
66
67 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 fn get_key(&self) -> Box<K>;
98
99 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 fn set_key(&mut self, key: Box<K>) -> &mut dyn PropertyConfigBuilder<K, V>;
112
113 fn set_default_value(&mut self, default_value: Box<V>) -> &mut dyn PropertyConfigBuilder<K, V>;
115
116 fn add_value_converter(
118 &mut self,
119 value_converter: Box<dyn RawTypeConverter>,
120 ) -> &mut dyn PropertyConfigBuilder<K, V>;
121
122 fn add_value_converters(
124 &mut self,
125 value_converters: Vec<Box<dyn RawTypeConverter>>,
126 ) -> &mut dyn PropertyConfigBuilder<K, V>;
127
128 fn set_value_filter(
130 &mut self,
131 value_filter: Box<dyn ValueFilter<V>>,
132 ) -> &mut dyn PropertyConfigBuilder<K, V>;
133
134 fn set_doc(&mut self, doc: &str) -> &mut dyn PropertyConfigBuilder<K, V>;
136
137 fn set_static(&mut self, is_static: bool) -> &mut dyn PropertyConfigBuilder<K, V>;
139
140 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 fn get_value(&self) -> Option<Box<V>>;
151
152 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>>;