diff --git a/src/lib.rs b/src/lib.rs index 2df09b1..45cbab9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -230,14 +230,10 @@ pub mod sdk { } object @ AnyProperty::ObjectBase(_) => { match object.as_any_object_base_property().unwrap() { - any_type::AnyObjectBaseProperty::Object(obj) => { - Type::Ptr(Box::new(Type::Class(unsafe { - // safety: any uclass is also a ustruct - obj.property_class() - .context("object property missing properry class")? - .cast() - }))) - } + any_type::AnyObjectBaseProperty::Object(obj) => Type::Class( + obj.property_class() + .context("object property missing properry class")?, + ), any_type::AnyObjectBaseProperty::WeakObject(obj) => Type::WeakPtr( obj.property_class() .context("weak ptr property missing property class.")?, @@ -293,7 +289,7 @@ pub mod sdk { ))?), enum_type: enm.uenum().context("enum property missing enum type")?, }, - AnyProperty::Struct(class) => Type::Class( + AnyProperty::Struct(class) => Type::Struct( class .ustruct() .context("struct property had no inner struct")?, @@ -733,7 +729,8 @@ pub mod sdk { underlying: Box, enum_type: UEnum, }, - Class(UStruct), + Class(UClass), + Struct(UStruct), } impl Type { @@ -746,6 +743,7 @@ pub mod sdk { Some(o.as_uobject()) } Type::Class(o) => Some(o.as_uobject()), + Type::Struct(o) => Some(o.as_uobject()), Type::Primitive(_) | Type::Name | Type::String | Type::Text => None, Type::Enum { enum_type, .. } => Some(enum_type.as_uobject()), } diff --git a/src/sdk/output/rust.rs b/src/sdk/output/rust.rs index 5f163d5..4f3b9b9 100644 --- a/src/sdk/output/rust.rs +++ b/src/sdk/output/rust.rs @@ -115,6 +115,11 @@ impl RustType for Type { write!(w, ">")?; } Type::Class(class) => { + write!(w, "Option<")?; + class.rust_type(sdk, w)?; + write!(w, ">")?; + } + Type::Struct(class) => { class.rust_type(sdk, w)?; } } @@ -133,27 +138,24 @@ pub fn generate_class(class: &Class, _sdk: &Sdk, w: &mut W) -> anyhow: let name = class.rust_name(); writeln!(w, "#[repr(transparent)]")?; - writeln!(w, "#[derive(Debug)]")?; + writeln!(w, "#[derive(Debug, Eq, PartialEq, Copy, Clone)]")?; if !is_class { - writeln!(w, "#[derive(Debug, Eq, PartialEq, Copy, Clone)]")?; - } - writeln!(w, "pub struct {name}(UnsafeCell<[u8; {size}]>);")?; + writeln!(w, "pub struct {name}(UnsafeCell<[u8; {size}]>);")?; - write!( - w, - r#" + write!( + w, + r#" impl AsPtr for {name} {{ -fn as_ptr(&self) -> *const u8 {{ -self.0.get() as _ -}} -fn as_mut_ptr(&self) -> *mut u8 {{ -self.0.get() -}} + fn as_ptr(&self) -> *const u8 {{ + self.0.get() as _ + }} + fn as_mut_ptr(&self) -> *mut u8 {{ + self.0.get() + }} }} "# - )?; + )?; - if !is_class { write!( w, r#" @@ -165,6 +167,22 @@ impl {name} {{ "# )?; } else { + writeln!(w, "pub struct {name}(NonNull>);")?; + + write!( + w, + r#" +impl AsPtr for {name} {{ + fn as_ptr(&self) -> *const u8 {{ + unsafe {{ self.0.as_ref().get() as _ }} + }} + fn as_mut_ptr(&self) -> *mut u8 {{ + unsafe {{ self.0.as_ref().get() as _ }} + }} +}} +"# + )?; + writeln!(w, "impl StaticClass for {name} {{")?; writeln!(w, "fn get_static_class() -> Option {{")?; write!(w, "let class: UClass = ")?; @@ -188,7 +206,7 @@ pub fn generate_class_impl(class: &Class, sdk: &Sdk, w: &mut W) -> any let name = class.rust_name(); - writeln!(w, "pub trait {}_Fields {{", name)?; + writeln!(w, "pub trait {}_Fields: AsPtr {{", name)?; for field in fields { write!(w, "fn get_{}(&self) -> &", field.name)?; field.ty.rust_type(sdk, w)?; @@ -213,7 +231,7 @@ pub fn generate_class_impl(class: &Class, sdk: &Sdk, w: &mut W) -> any generate_method_params(class, method, sdk, w)?; } - writeln!(w, "pub trait {}_Methods {{", name)?; + writeln!(w, "pub trait {}_Methods: AsPtr {{", name)?; for method in methods { generate_method(class, method, sdk, w)?; @@ -313,7 +331,10 @@ pub fn generate_method( } writeln!(w, "let flags = *func.function_flags();")?; - writeln!(w, "process_event(&self as *const _, func, &mut params);")?; + writeln!( + w, + "process_event(self.as_ptr() as *const _, func, &mut params);" + )?; writeln!(w, "*func.function_flags_mut() = flags;")?; for param in &method.parameters {