Derive Macro GodotConvert
#[derive(GodotConvert)]
{
// Attributes available to this derive:
#[godot]
}
Expand description
Derive macro for GodotConvert
on structs.
This derive macro also derives ToGodot
and FromGodot
.
§Choosing a Via type
To specify the Via
type that your type should be converted to, you must use the godot
attribute.
There are currently two modes supported.
§transparent
If you specify #[godot(transparent)]
on single-field struct, your struct will be treated as a newtype struct. This means that all derived
operations on the struct will defer to the type of that single field.
§Example
use godot::prelude::*;
#[derive(GodotConvert)]
#[godot(transparent)]
struct CustomVector2(Vector2);
let obj = CustomVector2(Vector2::new(10.0, 25.0));
assert_eq!(obj.to_godot(), Vector2::new(10.0, 25.0));
This also works for named structs with a single field:
use godot::prelude::*;
#[derive(GodotConvert)]
#[godot(transparent)]
struct MyNewtype {
string: GString,
}
let obj = MyNewtype {
string: "hello!".into(),
};
assert_eq!(obj.to_godot(), GString::from("hello!"));
However, it will not work for structs with more than one field, even if that field is zero sized:
use godot::prelude::*;
#[derive(GodotConvert)]
#[godot(transparent)]
struct SomeNewtype {
int: i64,
zst: (),
}
You can also not use transparent
with enums:
use godot::prelude::*;
#[derive(GodotConvert)]
#[godot(transparent)]
enum MyEnum {
Int(i64)
}
§via = <type>
For c-style enums, that is enums where all the variants are unit-like, you can use via = <type>
to convert the enum into that
type.
The types you can use this with currently are:
GString
i8
,i16
,i32
,i64
u8
,u16
,u32
When using one of the integer types, each variant of the enum will be converted into its discriminant.
§Examples
use godot::prelude::*;
#[derive(GodotConvert)]
#[godot(via = GString)]
enum MyEnum {
A,
B,
C,
}
assert_eq!(MyEnum::A.to_godot(), GString::from("A"));
assert_eq!(MyEnum::B.to_godot(), GString::from("B"));
assert_eq!(MyEnum::C.to_godot(), GString::from("C"));
use godot::prelude::*;
#[derive(GodotConvert)]
#[godot(via = i64)]
enum MyEnum {
A,
B,
C,
}
assert_eq!(MyEnum::A.to_godot(), 0);
assert_eq!(MyEnum::B.to_godot(), 1);
assert_eq!(MyEnum::C.to_godot(), 2);
Explicit discriminants are used for integers:
use godot::prelude::*;
#[derive(GodotConvert)]
#[godot(via = u8)]
enum MyEnum {
A,
B = 10,
C,
}
assert_eq!(MyEnum::A.to_godot(), 0);
assert_eq!(MyEnum::B.to_godot(), 10);
assert_eq!(MyEnum::C.to_godot(), 11);