Map core::convert::Infallible to a similar manually-defined struct
authorMatt Corallo <git@bluematt.me>
Wed, 22 Sep 2021 23:13:34 +0000 (23:13 +0000)
committerMatt Corallo <git@bluematt.me>
Thu, 23 Sep 2021 18:35:11 +0000 (18:35 +0000)
c-bindings-gen/src/main.rs
c-bindings-gen/src/types.rs
lightning-c-bindings/src/c_types/mod.rs

index 1572b313582db2e2275b23b99ca3ba77a900b3cb..38704b2c8d99220c42b0622b5326e244f53b84e5 100644 (file)
@@ -33,7 +33,7 @@ mod blocks;
 use types::*;
 use blocks::*;
 
-const DEFAULT_IMPORTS: &'static str = "\nuse std::str::FromStr;\nuse std::ffi::c_void;\nuse bitcoin::hashes::Hash;\nuse crate::c_types::*;\n";
+const DEFAULT_IMPORTS: &'static str = "\nuse std::str::FromStr;\nuse std::ffi::c_void;\nuse core::convert::Infallible;\nuse bitcoin::hashes::Hash;\nuse crate::c_types::*;\n";
 
 // *************************************
 // *** Manually-expanded conversions ***
index b1224a96d8be657623d32bdc670f21f6c842c27c..d15cec296571920519c78bdd1c7d0e5f939bf4b4 100644 (file)
@@ -889,6 +889,8 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        "std::time::SystemTime" => Some("u64"),
                        "std::io::Error" => Some("crate::c_types::IOError"),
 
+                       "core::convert::Infallible" => Some("crate::c_types::NotConstructable"),
+
                        "bech32::u5" => Some("crate::c_types::u5"),
                        "core::num::NonZeroU8" => Some("u8"),
 
@@ -967,6 +969,8 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        // Note that we'll panic for String if is_ref, as we only have non-owned memory, we
                        // cannot create a &String.
 
+                       "core::convert::Infallible" => Some("panic!(\"You must never construct a NotConstructable! : "),
+
                        "std::time::Duration"|"core::time::Duration" => Some("std::time::Duration::from_secs("),
                        "std::time::SystemTime" => Some("(::std::time::SystemTime::UNIX_EPOCH + std::time::Duration::from_secs("),
 
@@ -1045,6 +1049,8 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        "alloc::string::String"|"String" => Some(".into_string()"),
                        "std::io::Error" if !is_ref => Some(".to_rust()"),
 
+                       "core::convert::Infallible" => Some("\")"),
+
                        "std::time::Duration"|"core::time::Duration" => Some(")"),
                        "std::time::SystemTime" => Some("))"),
 
@@ -1136,6 +1142,8 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        "std::time::SystemTime" => Some(""),
                        "std::io::Error" if !is_ref => Some("crate::c_types::IOError::from_rust("),
 
+                       "core::convert::Infallible" => Some("panic!(\"Cannot construct an Infallible: "),
+
                        "bech32::u5" => Some(""),
 
                        "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
@@ -1208,6 +1216,8 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        "std::time::SystemTime" => Some(".duration_since(::std::time::SystemTime::UNIX_EPOCH).expect(\"Times must be post-1970\").as_secs()"),
                        "std::io::Error" if !is_ref => Some(")"),
 
+                       "core::convert::Infallible" => Some("\")"),
+
                        "bech32::u5" => Some(".into()"),
 
                        "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
index 5db6dda00b908375df6a5b02accae57d2f21a89a..18d8a08dfa7b5cda7b17e7c1ba33cd3cb28e7fd2 100644 (file)
@@ -17,6 +17,16 @@ 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<core::convert::Infallible> 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)]