Implement conversion of std::io::Error to Rust
authorMatt Corallo <git@bluematt.me>
Wed, 14 Apr 2021 02:58:32 +0000 (22:58 -0400)
committerMatt Corallo <git@bluematt.me>
Wed, 2 Jun 2021 16:25:20 +0000 (16:25 +0000)
c-bindings-gen/src/types.rs
lightning-c-bindings/src/c_types/mod.rs

index bd0c9c5ceecc8cfcb4aaa8ce175cda800d73ddab..6ea8e284a5286e1e267d01082ab6e8a0967007b6 100644 (file)
@@ -950,6 +950,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
 
                        "str" if is_ref => Some(""),
                        "alloc::string::String"|"String" => Some(""),
+                       "std::io::Error" if !is_ref => Some(""),
                        // Note that we'll panic for String if is_ref, as we only have non-owned memory, we
                        // cannot create a &String.
 
@@ -1016,6 +1017,7 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
 
                        "str" if is_ref => Some(".into_str()"),
                        "alloc::string::String"|"String" => Some(".into_string()"),
+                       "std::io::Error" if !is_ref => Some(".to_rust()"),
 
                        "std::time::Duration"|"core::time::Duration" => Some(")"),
                        "std::time::SystemTime" => Some("))"),
index 6267b80bc2dd007ba9476f76d01127d2b9a74937..b6b1bbf0ac85a60025ee97aa5a578059ab973f71 100644 (file)
@@ -198,6 +198,28 @@ impl IOError {
                        _ => IOError::Other,
                }
        }
+       pub(crate) fn to_rust(&self) -> std::io::Error {
+               std::io::Error::new(match self {
+                       IOError::NotFound => std::io::ErrorKind::NotFound,
+                       IOError::PermissionDenied => std::io::ErrorKind::PermissionDenied,
+                       IOError::ConnectionRefused => std::io::ErrorKind::ConnectionRefused,
+                       IOError::ConnectionReset => std::io::ErrorKind::ConnectionReset,
+                       IOError::ConnectionAborted => std::io::ErrorKind::ConnectionAborted,
+                       IOError::NotConnected => std::io::ErrorKind::NotConnected,
+                       IOError::AddrInUse => std::io::ErrorKind::AddrInUse,
+                       IOError::AddrNotAvailable => std::io::ErrorKind::AddrNotAvailable,
+                       IOError::BrokenPipe => std::io::ErrorKind::BrokenPipe,
+                       IOError::AlreadyExists => std::io::ErrorKind::AlreadyExists,
+                       IOError::WouldBlock => std::io::ErrorKind::WouldBlock,
+                       IOError::InvalidInput => std::io::ErrorKind::InvalidInput,
+                       IOError::InvalidData => std::io::ErrorKind::InvalidData,
+                       IOError::TimedOut => std::io::ErrorKind::TimedOut,
+                       IOError::WriteZero => std::io::ErrorKind::WriteZero,
+                       IOError::Interrupted => std::io::ErrorKind::Interrupted,
+                       IOError::Other => std::io::ErrorKind::Other,
+                       IOError::UnexpectedEof => std::io::ErrorKind::UnexpectedEof,
+               }, "")
+       }
 }
 
 #[repr(C)]