Skip to content

Commit db8666d

Browse files
committed
glib: split new/with_type for EnumClass/FlagsClass
1 parent 2b2bc94 commit db8666d

File tree

4 files changed

+28
-21
lines changed

4 files changed

+28
-21
lines changed

glib-macros/src/variant_derive.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -552,18 +552,15 @@ fn derive_variant_for_c_enum(
552552
),
553553
EnumMode::Enum { repr: false } => (
554554
quote! {
555-
let ty = <Self as #glib::StaticType>::static_type();
556-
let enum_class = #glib::EnumClass::new(ty);
557-
let enum_class = ::core::option::Option::unwrap(enum_class);
555+
let enum_class = #glib::EnumClass::new::<Self>();
558556
let value = <Self as #glib::translate::IntoGlib>::into_glib(*self);
559557
let value = #glib::EnumClass::value(&enum_class, value);
560558
let value = ::core::option::Option::unwrap(value);
561559
let nick = #glib::EnumValue::nick(&value);
562560
#glib::ToVariant::to_variant(nick)
563561
},
564562
quote! {
565-
let ty = <Self as #glib::StaticType>::static_type();
566-
let enum_class = #glib::EnumClass::new(ty)?;
563+
let enum_class = #glib::EnumClass::new::<Self>();
567564
let tag = #glib::Variant::str(&variant)?;
568565
let value = #glib::EnumClass::value_by_nick(&enum_class, tag)?;
569566
let value = #glib::EnumValue::value(&value);
@@ -581,16 +578,13 @@ fn derive_variant_for_c_enum(
581578
),
582579
EnumMode::Flags { repr: false } => (
583580
quote! {
584-
let ty = <Self as #glib::StaticType>::static_type();
585-
let flags_class = #glib::FlagsClass::new(ty);
586-
let flags_class = ::core::option::Option::unwrap(flags_class);
581+
let flags_class = #glib::FlagsClass::new::<Self>();
587582
let value = <Self as #glib::translate::IntoGlib>::into_glib(*self);
588583
let s = #glib::FlagsClass::to_nick_string(&flags_class, value);
589584
#glib::ToVariant::to_variant(&s)
590585
},
591586
quote! {
592-
let ty = <Self as #glib::StaticType>::static_type();
593-
let flags_class = #glib::FlagsClass::new(ty)?;
587+
let flags_class = #glib::FlagsClass::new::<Self>();
594588
let s = #glib::Variant::str(&variant)?;
595589
let value = #glib::FlagsClass::from_nick_string(&flags_class, s).ok()?;
596590
::core::option::Option::Some(unsafe { #glib::translate::from_glib(value) })

glib-macros/tests/test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ fn derive_enum() {
120120
assert!(t.is_a(glib::Type::ENUM));
121121
assert_eq!(t.name(), "TestAnimalType");
122122

123-
let e = glib::EnumClass::new(t).expect("EnumClass::new failed");
123+
let e = glib::EnumClass::with_type(t).expect("EnumClass::new failed");
124124
let v = e.value(0).expect("EnumClass::get_value(0) failed");
125125
assert_eq!(v.name(), "Goat");
126126
assert_eq!(v.nick(), "goat");
@@ -221,7 +221,7 @@ fn attr_flags() {
221221
assert!(t.is_a(glib::Type::FLAGS));
222222
assert_eq!(t.name(), "MyFlags");
223223

224-
let e = glib::FlagsClass::new(t).expect("FlagsClass::new failed");
224+
let e = glib::FlagsClass::with_type(t).expect("FlagsClass::new failed");
225225
let v = e.value(1).expect("FlagsClass::get_value(1) failed");
226226
assert_eq!(v.name(), "Flag A");
227227
assert_eq!(v.nick(), "nick-a");

glib/src/enums.rs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{cmp, ffi::CStr, fmt, ptr};
55
use crate::{
66
translate::*,
77
value::{FromValue, ValueTypeChecker},
8-
Type, Value,
8+
HasParamSpec, ParamSpecEnum, ParamSpecFlags, StaticType, Type, Value,
99
};
1010

1111
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
@@ -67,11 +67,18 @@ impl fmt::Debug for EnumClass {
6767
}
6868

6969
impl EnumClass {
70+
// rustdoc-stripper-ignore-next
71+
/// Create a new `EnumClass` from a static type `T`.
72+
///
73+
/// Panics if `T` is not representing an enum.
74+
pub fn new<T: StaticType + HasParamSpec<ParamSpec = ParamSpecEnum>>() -> Self {
75+
Self::with_type(T::static_type()).expect("invalid enum class")
76+
}
7077
// rustdoc-stripper-ignore-next
7178
/// Create a new `EnumClass` from a `Type`.
7279
///
7380
/// Returns `None` if `type_` is not representing an enum.
74-
pub fn new(type_: Type) -> Option<Self> {
81+
pub fn with_type(type_: Type) -> Option<Self> {
7582
unsafe {
7683
let is_enum: bool = from_glib(gobject_ffi::g_type_is_a(
7784
type_.into_glib(),
@@ -255,7 +262,7 @@ impl EnumValue {
255262
/// Convert enum value from a `Value`.
256263
pub fn from_value(value: &Value) -> Option<(EnumClass, &EnumValue)> {
257264
unsafe {
258-
let enum_class = EnumClass::new(value.type_())?;
265+
let enum_class = EnumClass::with_type(value.type_())?;
259266
let v = enum_class.value(gobject_ffi::g_value_get_enum(value.to_glib_none().0))?;
260267
let v = &*(v as *const EnumValue);
261268
Some((enum_class, v))
@@ -341,11 +348,18 @@ impl fmt::Debug for FlagsClass {
341348
}
342349

343350
impl FlagsClass {
351+
// rustdoc-stripper-ignore-next
352+
/// Create a new `FlagsClass` from a static type `T`.
353+
///
354+
/// Panics if `T` is not representing an flags type.
355+
pub fn new<T: StaticType + HasParamSpec<ParamSpec = ParamSpecFlags>>() -> Self {
356+
Self::with_type(T::static_type()).expect("invalid flags class")
357+
}
344358
// rustdoc-stripper-ignore-next
345359
/// Create a new `FlagsClass` from a `Type`
346360
///
347361
/// Returns `None` if `type_` is not representing a flags type.
348-
pub fn new(type_: Type) -> Option<Self> {
362+
pub fn with_type(type_: Type) -> Option<Self> {
349363
unsafe {
350364
let is_flags: bool = from_glib(gobject_ffi::g_type_is_a(
351365
type_.into_glib(),
@@ -771,7 +785,7 @@ impl FlagsValue {
771785
/// Convert flags values from a `Value`. This returns all flags that are set.
772786
pub fn from_value(value: &Value) -> Option<(FlagsClass, Vec<&FlagsValue>)> {
773787
unsafe {
774-
let flags_class = FlagsClass::new(value.type_())?;
788+
let flags_class = FlagsClass::with_type(value.type_())?;
775789
let mut res = Vec::new();
776790
let f = gobject_ffi::g_value_get_flags(value.to_glib_none().0);
777791
for v in flags_class.values() {
@@ -931,11 +945,10 @@ impl std::error::Error for InvalidFlagsError {}
931945
#[cfg(test)]
932946
mod tests {
933947
use super::*;
934-
use crate::StaticType;
935948

936949
#[test]
937950
fn test_flags() {
938-
let flags = FlagsClass::new(crate::BindingFlags::static_type()).unwrap();
951+
let flags = FlagsClass::new::<crate::BindingFlags>();
939952
let values = flags.values();
940953
let def1 = values
941954
.iter()

glib/src/param_spec.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,7 +1027,7 @@ impl ParamSpecEnum {
10271027

10281028
debug_assert!(!(*ptr).enum_class.is_null());
10291029

1030-
crate::EnumClass::new(from_glib((*(*ptr).enum_class).g_type_class.g_type))
1030+
crate::EnumClass::with_type(from_glib((*(*ptr).enum_class).g_type_class.g_type))
10311031
.expect("Invalid enum class")
10321032
}
10331033
}
@@ -1175,7 +1175,7 @@ impl ParamSpecFlags {
11751175

11761176
debug_assert!(!(*ptr).flags_class.is_null());
11771177

1178-
crate::FlagsClass::new(from_glib((*(*ptr).flags_class).g_type_class.g_type))
1178+
crate::FlagsClass::with_type(from_glib((*(*ptr).flags_class).g_type_class.g_type))
11791179
.expect("Invalid flags class")
11801180
}
11811181
}

0 commit comments

Comments
 (0)