X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning-c-bindings%2Fsrc%2Fc_types%2Fmod.rs;h=3d6f08accc3926d3153ecd45aab38498ce0c5f0e;hb=fc3bfd9a0b3cf846bd9c3187bb1b0363611f0708;hp=18d8a08dfa7b5cda7b17e7c1ba33cd3cb28e7fd2;hpb=4ed52804d3cd73f05bba6a705528d0d43495aa88;p=ldk-c-bindings diff --git a/lightning-c-bindings/src/c_types/mod.rs b/lightning-c-bindings/src/c_types/mod.rs index 18d8a08..3d6f08a 100644 --- a/lightning-c-bindings/src/c_types/mod.rs +++ b/lightning-c-bindings/src/c_types/mod.rs @@ -430,12 +430,14 @@ pub(crate) fn serialize_obj(i: &I) -> derive pub(crate) fn deserialize_obj(s: u8slice) -> Result { I::read(&mut s.to_slice()) } +pub(crate) fn maybe_deserialize_obj(s: u8slice) -> Result, lightning::ln::msgs::DecodeError> { + I::read(&mut s.to_slice()) +} pub(crate) fn deserialize_obj_arg>(s: u8slice, args: A) -> Result { I::read(&mut s.to_slice(), args) } #[repr(C)] -#[derive(Clone)] /// A Rust str object, ie a reference to a UTF8-valid string. /// This is *not* null-terminated so cannot be used directly as a C string! pub struct Str { @@ -451,6 +453,13 @@ impl Into for &'static str { Str { chars: self.as_ptr(), len: self.len(), chars_is_owned: false } } } +impl Into for &mut &'static str { + fn into(self) -> Str { + let us: &'static str = *self; + us.into() + } +} + impl Str { pub(crate) fn into_str(&self) -> &'static str { if self.len == 0 { return ""; } @@ -479,6 +488,11 @@ impl Into for String { Str { chars: s.as_ptr(), len: s.len(), chars_is_owned: true } } } +impl Clone for Str { + fn clone(&self) -> Self { + self.into_str().clone().into() + } +} impl Drop for Str { fn drop(&mut self) { @@ -603,3 +617,28 @@ pub(crate) mod ObjOps { } } } + +pub(crate) struct SmartPtr { + ptr: *mut T, +} +impl SmartPtr { + pub(crate) fn from_obj(o: T) -> Self { + Self { ptr: Box::into_raw(Box::new(o)) } + } + pub(crate) fn null() -> Self { + Self { ptr: std::ptr::null_mut() } + } +} +impl Drop for SmartPtr { + fn drop(&mut self) { + if self.ptr != std::ptr::null_mut() { + unsafe { Box::from_raw(self.ptr); } + } + } +} +impl std::ops::Deref for SmartPtr { + type Target = *mut T; + fn deref(&self) -> &*mut T { + &self.ptr + } +}