Skip to content

Commit 976e84a

Browse files
authored
Merge pull request #565 from arcnmx/variant-asref
glib: impl AsRef<Variant> for Variant
2 parents 2d2f44f + 2673cb3 commit 976e84a

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

glib-macros/src/variant_derive.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pub fn derive_variant_for_struct(
3535
.collect::<Vec<_>>();
3636

3737
let idents = (0..types.len()).map(syn::Index::from).collect::<Vec<_>>();
38+
let idents_len = idents.len();
3839

3940
let static_variant_type = quote! {
4041
impl #generics #glib::StaticVariantType for #ident #generics {
@@ -62,7 +63,7 @@ pub fn derive_variant_for_struct(
6263
let to_variant = quote! {
6364
impl #generics #glib::ToVariant for #ident #generics {
6465
fn to_variant(&self) -> #glib::Variant {
65-
#glib::Variant::tuple_from_iter(::std::array::IntoIter::new([
66+
#glib::Variant::tuple_from_iter(::std::array::IntoIter::<#glib::Variant, #idents_len>::new([
6667
#(
6768
#glib::ToVariant::to_variant(&self.#idents)
6869
),*

glib/src/variant.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ impl Variant {
439439
///
440440
/// This function panics if not all variants are of type `type_`.
441441
#[doc(alias = "g_variant_new_array")]
442-
pub fn array_from_iter_with_type<I: IntoIterator<Item = Variant>>(
442+
pub fn array_from_iter_with_type<T: AsRef<Variant>, I: IntoIterator<Item = T>>(
443443
type_: &VariantTy,
444444
children: I,
445445
) -> Self {
@@ -448,6 +448,7 @@ impl Variant {
448448
ffi::g_variant_builder_init(builder.as_mut_ptr(), type_.as_array().to_glib_none().0);
449449
let mut builder = builder.assume_init();
450450
for value in children.into_iter() {
451+
let value = value.as_ref();
451452
if ffi::g_variant_is_of_type(value.to_glib_none().0, type_.to_glib_none().0)
452453
== ffi::GFALSE
453454
{
@@ -480,13 +481,13 @@ impl Variant {
480481
// rustdoc-stripper-ignore-next
481482
/// Creates a new Variant tuple from children.
482483
#[doc(alias = "g_variant_new_tuple")]
483-
pub fn tuple_from_iter(children: impl IntoIterator<Item = Variant>) -> Self {
484+
pub fn tuple_from_iter(children: impl IntoIterator<Item = impl AsRef<Variant>>) -> Self {
484485
unsafe {
485486
let mut builder = mem::MaybeUninit::uninit();
486487
ffi::g_variant_builder_init(builder.as_mut_ptr(), VariantTy::TUPLE.to_glib_none().0);
487488
let mut builder = builder.assume_init();
488489
for value in children.into_iter() {
489-
ffi::g_variant_builder_add_value(&mut builder, value.to_glib_none().0);
490+
ffi::g_variant_builder_add_value(&mut builder, value.as_ref().to_glib_none().0);
490491
}
491492
from_glib_none(ffi::g_variant_builder_end(&mut builder))
492493
}
@@ -881,6 +882,12 @@ impl Hash for Variant {
881882
}
882883
}
883884

885+
impl AsRef<Variant> for Variant {
886+
fn as_ref(&self) -> &Self {
887+
self
888+
}
889+
}
890+
884891
// rustdoc-stripper-ignore-next
885892
/// Converts to `Variant`.
886893
pub trait ToVariant {

0 commit comments

Comments
 (0)