XXX? C type for bitcoin::util::address::WitnessVersion
authorJeffrey Czyz <jkczyz@gmail.com>
Thu, 19 May 2022 15:22:56 +0000 (10:22 -0500)
committerMatt Corallo <git@bluematt.me>
Fri, 24 Jun 2022 02:44:16 +0000 (02:44 +0000)
c-bindings-gen/src/types.rs
lightning-c-bindings/src/c_types/mod.rs

index b10ce3ded424fbf0fa15cb8f64de3ac918dc64e1..1e1bffa34b85e4fa52756d6abcd9d80936299030 100644 (file)
@@ -901,6 +901,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        "bitcoin::blockdata::transaction::Transaction"|"bitcoin::Transaction" => Some("crate::c_types::Transaction"),
                        "bitcoin::blockdata::transaction::TxOut" if !is_ref => Some("crate::c_types::TxOut"),
                        "bitcoin::network::constants::Network" => Some("crate::bitcoin::network::Network"),
+                       "bitcoin::util::address::WitnessVersion" => Some("crate::c_types::WitnessVersion"),
                        "bitcoin::blockdata::block::BlockHeader" if is_ref  => Some("*const [u8; 80]"),
                        "bitcoin::blockdata::block::Block" if is_ref  => Some("crate::c_types::u8slice"),
 
@@ -986,6 +987,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        "bitcoin::blockdata::transaction::OutPoint" => Some("crate::c_types::C_to_bitcoin_outpoint("),
                        "bitcoin::blockdata::transaction::TxOut" if !is_ref => Some(""),
                        "bitcoin::network::constants::Network" => Some(""),
+                       "bitcoin::util::address::WitnessVersion" => Some(""),
                        "bitcoin::blockdata::block::BlockHeader" => Some("&::bitcoin::consensus::encode::deserialize(unsafe { &*"),
                        "bitcoin::blockdata::block::Block" if is_ref => Some("&::bitcoin::consensus::encode::deserialize("),
 
@@ -1067,6 +1069,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        "bitcoin::blockdata::transaction::OutPoint" => Some(")"),
                        "bitcoin::blockdata::transaction::TxOut" if !is_ref => Some(".into_rust()"),
                        "bitcoin::network::constants::Network" => Some(".into_bitcoin()"),
+                       "bitcoin::util::address::WitnessVersion" => Some(".into()"),
                        "bitcoin::blockdata::block::BlockHeader" => Some(" }).unwrap()"),
                        "bitcoin::blockdata::block::Block" => Some(".to_slice()).unwrap()"),
 
@@ -1159,6 +1162,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        "bitcoin::blockdata::transaction::OutPoint" => Some("crate::c_types::bitcoin_to_C_outpoint("),
                        "bitcoin::blockdata::transaction::TxOut" if !is_ref => Some("crate::c_types::TxOut::from_rust("),
                        "bitcoin::network::constants::Network" => Some("crate::bitcoin::network::Network::from_bitcoin("),
+                       "bitcoin::util::address::WitnessVersion" => Some(""),
                        "bitcoin::blockdata::block::BlockHeader" if is_ref => Some("&local_"),
                        "bitcoin::blockdata::block::Block" if is_ref => Some("crate::c_types::u8slice::from_slice(&local_"),
 
@@ -1234,6 +1238,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        "bitcoin::blockdata::transaction::OutPoint" => Some(")"),
                        "bitcoin::blockdata::transaction::TxOut" if !is_ref => Some(")"),
                        "bitcoin::network::constants::Network" => Some(")"),
+                       "bitcoin::util::address::WitnessVersion" => Some(".into()"),
                        "bitcoin::blockdata::block::BlockHeader" if is_ref => Some(""),
                        "bitcoin::blockdata::block::Block" if is_ref => Some(")"),
 
index 71aa6793cc25c9c3f2de853dedb9de0ff90e5f2b..471b067ac94fab9d19e1e6f034fdf49d1eea8cc2 100644 (file)
@@ -12,6 +12,7 @@ use bitcoin::secp256k1::Error as SecpError;
 use bitcoin::secp256k1::ecdsa::RecoveryId;
 use bitcoin::secp256k1::ecdsa::RecoverableSignature as SecpRecoverableSignature;
 use bitcoin::bech32;
+use bitcoin::util::address;
 
 use core::convert::TryInto; // Bindings need at least rustc 1.34
 use core::ffi::c_void;
@@ -46,6 +47,18 @@ impl Into<bech32::u5> for u5 {
        fn into(self) -> bech32::u5 { bech32::u5::try_from_u8(self.0).expect("u5 objects must be in the range 0..32") }
 }
 
+/// Integer in the range `0..=16`
+#[derive(PartialEq, Eq, Copy, Clone)]
+#[repr(C)]
+pub struct WitnessVersion(u8);
+
+impl From<address::WitnessVersion> for WitnessVersion {
+       fn from(o: address::WitnessVersion) -> Self { Self(o.into_num()) }
+}
+impl Into<address::WitnessVersion> for WitnessVersion {
+       fn into(self) -> address::WitnessVersion { address::WitnessVersion::from_num(self.0).expect("WitnessVersion objects must be in the range 0..=16") }
+}
+
 #[derive(Clone)]
 #[repr(C)]
 /// Represents a valid secp256k1 public key serialized in "compressed form" as a 33 byte array.