glib_signal/value_option.rs
1use glib::{value::ToValue, Value};
2
3pub trait ToValueOption: Sized {
4 type Type: Into<Self>;
5
6 fn to_value_option(self) -> Option<Value>;
7}
8
9pub struct PrimitiveValue<T>(T);
10impl<T> From<T> for PrimitiveValue<T> {
11 fn from(v: T) -> Self {
12 Self(v)
13 }
14}
15impl ToValueOption for PrimitiveValue<()> {
16 type Type = ();
17
18 fn to_value_option(self) -> Option<Value> {
19 None
20 }
21}
22impl ToValueOption for PrimitiveValue<usize> {
23 type Type = usize;
24
25 #[cfg(target_pointer_width = "16")]
26 fn to_value_option(self) -> Option<Value> {
27 Some((self.0 as u16).to_value())
28 }
29
30 #[cfg(target_pointer_width = "32")]
31 fn to_value_option(self) -> Option<Value> {
32 Some((self.0 as u32).to_value())
33 }
34
35 #[cfg(target_pointer_width = "64")]
36 fn to_value_option(self) -> Option<Value> {
37 Some((self.0 as u64).to_value())
38 }
39}
40
41impl<T: ToValue> ToValueOption for T {
42 type Type = T;
43
44 fn to_value_option(self) -> Option<Value> {
45 Some(ToValue::to_value(&self))
46 }
47}