Skip to content

Commit 4330a6c

Browse files
authored
Merge pull request #187 from toasteater/feature/split-tovariant-fromvariant
Split ToVariant and FromVariant traits
2 parents fc2e06c + 3fbadd2 commit 4330a6c

17 files changed

+81
-8
lines changed

bindings_generator/src/special_methods.rs

+2
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ unsafe impl GodotObject for {name} {{
103103
104104
impl ToVariant for {name} {{
105105
fn to_variant(&self) -> Variant {{ Variant::from_object(self) }}
106+
}}
107+
impl FromVariant for {name} {{
106108
fn from_variant(variant: &Variant) -> Option<Self> {{ variant.try_to_object::<Self>() }}
107109
}}"#,
108110
name = class.name,

gdnative-core/src/byte_array.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::get_api;
22
use crate::sys;
33
use crate::ToVariant;
4+
use crate::FromVariant;
45
use crate::Variant;
56
use crate::VariantArray;
67

@@ -110,6 +111,9 @@ impl ToVariant for ByteArray {
110111
fn to_variant(&self) -> Variant {
111112
Variant::from_byte_array(self)
112113
}
114+
}
115+
116+
impl FromVariant for ByteArray {
113117
fn from_variant(variant: &Variant) -> Option<Self> {
114118
variant.try_to_byte_array()
115119
}

gdnative-core/src/color_array.rs

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::get_api;
22
use crate::sys;
33
use crate::Color;
44
use crate::ToVariant;
5+
use crate::FromVariant;
56
use crate::Variant;
67
use crate::VariantArray;
78

@@ -114,6 +115,9 @@ impl ToVariant for ColorArray {
114115
fn to_variant(&self) -> Variant {
115116
Variant::from_color_array(self)
116117
}
118+
}
119+
120+
impl FromVariant for ColorArray {
117121
fn from_variant(variant: &Variant) -> Option<Self> {
118122
variant.try_to_color_array()
119123
}

gdnative-core/src/dictionary.rs

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::get_api;
22
use crate::sys;
33
use crate::GodotString;
44
use crate::ToVariant;
5+
use crate::FromVariant;
56
use crate::Variant;
67
use crate::VariantArray;
78
use std::fmt;
@@ -126,6 +127,9 @@ impl ToVariant for Dictionary {
126127
fn to_variant(&self) -> Variant {
127128
Variant::from_dictionary(self)
128129
}
130+
}
131+
132+
impl FromVariant for Dictionary {
129133
fn from_variant(variant: &Variant) -> Option<Self> {
130134
variant.try_to_dictionary()
131135
}

gdnative-core/src/float32_array.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::get_api;
22
use crate::sys;
33
use crate::ToVariant;
4+
use crate::FromVariant;
45
use crate::Variant;
56
use crate::VariantArray;
67

@@ -110,6 +111,9 @@ impl ToVariant for Float32Array {
110111
fn to_variant(&self) -> Variant {
111112
Variant::from_float32_array(self)
112113
}
114+
}
115+
116+
impl FromVariant for Float32Array {
113117
fn from_variant(variant: &Variant) -> Option<Self> {
114118
variant.try_to_float32_array()
115119
}

gdnative-core/src/init.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use super::*;
2525
use crate::get_api;
2626
use crate::NativeClass;
2727
use crate::ToVariant;
28+
use crate::FromVariant;
2829
use crate::Variant;
2930
use libc;
3031
use std::ffi::CString;
@@ -280,7 +281,7 @@ impl<C: NativeClass> ClassBuilder<C> {
280281

281282
pub fn add_property<T, S, G>(&self, property: Property<T, S, G>)
282283
where
283-
T: ToVariant,
284+
T: ToVariant + FromVariant,
284285
S: PropertySetter<C, T>,
285286
G: PropertyGetter<C, T>,
286287
{
@@ -482,7 +483,7 @@ pub struct Signal<'l> {
482483
pub args: &'l [SignalArgument<'l>],
483484
}
484485

485-
pub unsafe trait PropertySetter<C: NativeClass, T: ToVariant> {
486+
pub unsafe trait PropertySetter<C: NativeClass, T: FromVariant> {
486487
unsafe fn as_godot_function(self) -> sys::godot_property_set_func;
487488
}
488489

@@ -508,7 +509,7 @@ extern "C" fn empty_getter(
508509

509510
extern "C" fn empty_free_func(_data: *mut libc::c_void) {}
510511

511-
unsafe impl<C: NativeClass, T: ToVariant> PropertySetter<C, T> for () {
512+
unsafe impl<C: NativeClass, T: FromVariant> PropertySetter<C, T> for () {
512513
unsafe fn as_godot_function(self) -> sys::godot_property_set_func {
513514
let mut set = sys::godot_property_set_func::default();
514515
set.set_func = Some(empty_setter);
@@ -529,7 +530,7 @@ unsafe impl<C: NativeClass, T: ToVariant> PropertyGetter<C, T> for () {
529530
unsafe impl<F, C, T> PropertySetter<C, T> for F
530531
where
531532
C: NativeClass,
532-
T: ToVariant,
533+
T: FromVariant,
533534
F: Fn(&mut C, T),
534535
{
535536
unsafe fn as_godot_function(self) -> sys::godot_property_set_func {
@@ -545,7 +546,7 @@ where
545546
val: *mut sys::godot_variant,
546547
) where
547548
C: NativeClass,
548-
T: ToVariant,
549+
T: FromVariant,
549550
F: Fn(&mut C, T),
550551
{
551552
unsafe {

gdnative-core/src/int32_array.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::get_api;
22
use crate::sys;
33
use crate::ToVariant;
4+
use crate::FromVariant;
45
use crate::Variant;
56
use crate::VariantArray;
67

@@ -110,6 +111,9 @@ impl ToVariant for Int32Array {
110111
fn to_variant(&self) -> Variant {
111112
Variant::from_int32_array(self)
112113
}
114+
}
115+
116+
impl FromVariant for Int32Array {
113117
fn from_variant(variant: &Variant) -> Option<Self> {
114118
variant.try_to_int32_array()
115119
}

gdnative-core/src/macros.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ macro_rules! godot_wrap_method {
408408
let mut offset = 0;
409409
$(
410410
let _variant: &$crate::Variant = ::std::mem::transmute(&mut *(*args).offset(offset));
411-
let $pname = if let Some(val) = <$pty as $crate::ToVariant>::from_variant(_variant) {
411+
let $pname = if let Some(val) = <$pty as $crate::FromVariant>::from_variant(_variant) {
412412
val
413413
} else {
414414
godot_error!("Incorrect argument type {:?} for argument {}",

gdnative-core/src/node_path.rs

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::get_api;
22
use crate::sys;
33
use crate::GodotString;
44
use crate::ToVariant;
5+
use crate::FromVariant;
56
use crate::Variant;
67
use std::fmt;
78

@@ -148,6 +149,9 @@ impl ToVariant for NodePath {
148149
fn to_variant(&self) -> Variant {
149150
Variant::from_node_path(self)
150151
}
152+
}
153+
154+
impl FromVariant for NodePath {
151155
fn from_variant(variant: &Variant) -> Option<Self> {
152156
variant.try_to_node_path()
153157
}

gdnative-core/src/string.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::get_api;
22
use crate::sys;
33
use crate::ToVariant;
4+
use crate::FromVariant;
45
use crate::Variant;
56

67
use std::cmp::Ordering;
@@ -204,6 +205,9 @@ impl ToVariant for GodotString {
204205
fn to_variant(&self) -> Variant {
205206
Variant::from_godot_string(self)
206207
}
208+
}
209+
210+
impl FromVariant for GodotString {
207211
fn from_variant(variant: &Variant) -> Option<Self> {
208212
variant.try_to_godot_string()
209213
}

gdnative-core/src/string_array.rs

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::get_api;
22
use crate::sys;
33
use crate::GodotString;
44
use crate::ToVariant;
5+
use crate::FromVariant;
56
use crate::Variant;
67
use crate::VariantArray;
78

@@ -111,6 +112,9 @@ impl ToVariant for StringArray {
111112
fn to_variant(&self) -> Variant {
112113
Variant::from_string_array(self)
113114
}
115+
}
116+
117+
impl FromVariant for StringArray {
114118
fn from_variant(variant: &Variant) -> Option<Self> {
115119
variant.try_to_string_array()
116120
}

gdnative-core/src/variant.rs

+22-2
Original file line numberDiff line numberDiff line change
@@ -690,17 +690,23 @@ godot_test!(
690690
}
691691
);
692692

693-
/// Types that can be converted to and from a `Variant`.
694-
pub trait ToVariant: Sized {
693+
/// Types that can be converted to a `Variant`.
694+
pub trait ToVariant {
695695
fn to_variant(&self) -> Variant;
696+
}
697+
698+
/// Types that can be converted from a `Variant`.
699+
pub trait FromVariant: Sized {
696700
fn from_variant(variant: &Variant) -> Option<Self>;
697701
}
698702

699703
impl ToVariant for () {
700704
fn to_variant(&self) -> Variant {
701705
Variant::new()
702706
}
707+
}
703708

709+
impl FromVariant for () {
704710
fn from_variant(variant: &Variant) -> Option<Self> {
705711
if variant.get_type() == VariantType::Nil {
706712
Some(())
@@ -720,7 +726,9 @@ macro_rules! impl_to_variant_for_int {
720726
Variant(ret)
721727
}
722728
}
729+
}
723730

731+
impl FromVariant for $ty {
724732
fn from_variant(variant: &Variant) -> Option<Self> {
725733
unsafe {
726734
let api = get_api();
@@ -752,7 +760,9 @@ macro_rules! godot_uint_impl {
752760
Variant(ret)
753761
}
754762
}
763+
}
755764

765+
impl FromVariant for $ty {
756766
fn from_variant(variant: &Variant) -> Option<Self> {
757767
unsafe {
758768
let api = get_api();
@@ -782,7 +792,9 @@ impl ToVariant for f32 {
782792
Variant(ret)
783793
}
784794
}
795+
}
785796

797+
impl FromVariant for f32 {
786798
fn from_variant(variant: &Variant) -> Option<Self> {
787799
unsafe {
788800
let api = get_api();
@@ -805,7 +817,9 @@ impl ToVariant for f64 {
805817
Variant(ret)
806818
}
807819
}
820+
}
808821

822+
impl FromVariant for f64 {
809823
fn from_variant(variant: &Variant) -> Option<Self> {
810824
unsafe {
811825
let api = get_api();
@@ -824,7 +838,9 @@ impl ToVariant for String {
824838
fn to_variant(&self) -> Variant {
825839
Variant::from_str(&self)
826840
}
841+
}
827842

843+
impl FromVariant for String {
828844
fn from_variant(variant: &Variant) -> Option<Self> {
829845
unsafe {
830846
let api = get_api();
@@ -850,7 +866,9 @@ impl ToVariant for bool {
850866
fn to_variant(&self) -> Variant {
851867
Variant::from_bool(*self)
852868
}
869+
}
853870

871+
impl FromVariant for bool {
854872
fn from_variant(variant: &Variant) -> Option<Self> {
855873
variant.try_to_bool()
856874
}
@@ -860,7 +878,9 @@ impl ToVariant for Variant {
860878
fn to_variant(&self) -> Variant {
861879
self.clone()
862880
}
881+
}
863882

883+
impl FromVariant for Variant {
864884
fn from_variant(variant: &Variant) -> Option<Self> {
865885
Some(variant.clone())
866886
}

gdnative-core/src/variant_array.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::get_api;
22
use crate::sys;
33
use crate::ToVariant;
4+
use crate::FromVariant;
45
use crate::Variant;
56

67
/// A reference-counted `Variant` vector. Godot's generic array data type.
@@ -176,6 +177,9 @@ impl ToVariant for VariantArray {
176177
fn to_variant(&self) -> Variant {
177178
Variant::from_array(self)
178179
}
180+
}
181+
182+
impl FromVariant for VariantArray {
179183
fn from_variant(variant: &Variant) -> Option<Self> {
180184
variant.try_to_array()
181185
}

gdnative-core/src/vector2.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
use crate::ToVariant;
2+
use crate::FromVariant;
23
use crate::Variant;
34
use crate::Vector2;
45

56
impl ToVariant for Vector2 {
67
fn to_variant(&self) -> Variant {
78
Variant::from_vector2(self)
89
}
10+
}
911

12+
impl FromVariant for Vector2 {
1013
fn from_variant(variant: &Variant) -> Option<Self> {
1114
variant.try_to_vector2()
1215
}

gdnative-core/src/vector2_array.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::get_api;
22
use crate::sys;
33
use crate::ToVariant;
4+
use crate::FromVariant;
45
use crate::Variant;
56
use crate::VariantArray;
67
use crate::Vector2;
@@ -114,6 +115,9 @@ impl ToVariant for Vector2Array {
114115
fn to_variant(&self) -> Variant {
115116
Variant::from_vector2_array(self)
116117
}
118+
}
119+
120+
impl FromVariant for Vector2Array {
117121
fn from_variant(variant: &Variant) -> Option<Self> {
118122
variant.try_to_vector2_array()
119123
}

gdnative-core/src/vector3.rs

+3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
use crate::ToVariant;
2+
use crate::FromVariant;
23
use crate::Variant;
34
use crate::Vector3;
45

56
impl ToVariant for Vector3 {
67
fn to_variant(&self) -> Variant {
78
Variant::from_vector3(self)
89
}
10+
}
911

12+
impl FromVariant for Vector3 {
1013
fn from_variant(variant: &Variant) -> Option<Self> {
1114
variant.try_to_vector3()
1215
}

gdnative-core/src/vector3_array.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::get_api;
22
use crate::sys;
33
use crate::ToVariant;
4+
use crate::FromVariant;
45
use crate::Variant;
56
use crate::VariantArray;
67
use crate::Vector3;
@@ -114,6 +115,9 @@ impl ToVariant for Vector3Array {
114115
fn to_variant(&self) -> Variant {
115116
Variant::from_vector3_array(self)
116117
}
118+
}
119+
120+
impl FromVariant for Vector3Array {
117121
fn from_variant(variant: &Variant) -> Option<Self> {
118122
variant.try_to_vector3_array()
119123
}

0 commit comments

Comments
 (0)