X-Git-Url: http://git.bitcoin.ninja/index.cgi?p=ldk-c-bindings;a=blobdiff_plain;f=lightning-c-bindings%2Fsrc%2Fc_types%2Fmod.rs;h=274981da8e02a22c3a7dc24e7e61aba72ea9e5f5;hp=8cbfddd469437b725c4dd2e3a04fc58e0f05e566;hb=fea3e0caec33c4828824f4491636c891b8a74aa5;hpb=7613eb0c40d726769bfc2b43e84421017858c532 diff --git a/lightning-c-bindings/src/c_types/mod.rs b/lightning-c-bindings/src/c_types/mod.rs index 8cbfddd..274981d 100644 --- a/lightning-c-bindings/src/c_types/mod.rs +++ b/lightning-c-bindings/src/c_types/mod.rs @@ -15,6 +15,18 @@ use bitcoin::bech32; use std::convert::TryInto; // Bindings need at least rustc 1.34 +use std::io::{Cursor, Read}; // TODO: We should use core2 here when we support no_std + +#[repr(C)] +/// A dummy struct of which an instance must never exist. +/// This corresponds to the Rust type `Infallible`, or, in unstable rust, `!` +pub struct NotConstructable { + _priv_thing: core::convert::Infallible, +} +impl From for NotConstructable { + fn from(_: core::convert::Infallible) -> Self { unreachable!(); } +} + /// Integer in the range `0..32` #[derive(PartialEq, Eq, Copy, Clone)] #[allow(non_camel_case_types)] @@ -355,6 +367,18 @@ impl u8slice { if self.datalen == 0 { return &[]; } unsafe { std::slice::from_raw_parts(self.data, self.datalen) } } + pub(crate) fn to_reader<'a>(&'a self) -> Cursor<&'a [u8]> { + let sl = self.to_slice(); + Cursor::new(sl) + } + pub(crate) fn from_vec(v: &derived::CVec_u8Z) -> u8slice { + Self::from_slice(v.as_slice()) + } +} +pub(crate) fn reader_to_vec(r: &mut R) -> derived::CVec_u8Z { + let mut res = Vec::new(); + r.read_to_end(&mut res).unwrap(); + derived::CVec_u8Z::from(res) } #[repr(C)] @@ -411,7 +435,6 @@ pub(crate) fn deserialize_obj_arg>(s } #[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 { @@ -455,6 +478,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) {