format!("::{}", seg.ident)
}).collect();
let first_seg_str = format!("{}", first_seg.ident);
- if first_seg_str == "std" {
- Some(first_seg_str + &remaining)
- } else if let Some((imp, _)) = self.imports.get(&first_seg.ident) {
+ if let Some((imp, _)) = self.imports.get(&first_seg.ident) {
if remaining != "" {
Some(imp.clone() + &remaining)
} else {
}
} else if let Some(_) = self.priv_modules.get(&first_seg.ident) {
Some(format!("{}::{}{}", self.module_path, first_seg.ident, remaining))
+ } else if first_seg_str == "std" || self.dependencies.contains(&first_seg.ident) {
+ Some(first_seg_str + &remaining)
} else { None }
}
}
}
}
+/// List of manually-generated types which are clonable
+fn initial_clonable_types() -> HashSet<String> {
+ let mut res = HashSet::new();
+ res.insert("crate::c_types::u5".to_owned());
+ res
+}
+
/// Top-level struct tracking everything which has been defined while walking the crate.
pub struct CrateTypes<'a> {
/// This may contain structs or enums, but only when either is mapped as
opaques: HashMap::new(), mirrored_enums: HashMap::new(), traits: HashMap::new(),
type_aliases: HashMap::new(), reverse_alias_map: HashMap::new(),
templates_defined: RefCell::new(HashMap::default()),
- clonable_types: RefCell::new(HashSet::new()), trait_impls: HashMap::new(),
+ clonable_types: RefCell::new(initial_clonable_types()), trait_impls: HashMap::new(),
template_file: RefCell::new(template_file), lib_ast: &libast,
}
}
// for arrays are different (https://github.com/eqrion/cbindgen/issues/528)
"[u8; 32]" if !is_ref => Some("crate::c_types::ThirtyTwoBytes"),
+ "[u8; 20]" if !is_ref => Some("crate::c_types::TwentyBytes"),
"[u8; 16]" if !is_ref => Some("crate::c_types::SixteenBytes"),
"[u8; 10]" if !is_ref => Some("crate::c_types::TenBytes"),
"[u8; 4]" if !is_ref => Some("crate::c_types::FourBytes"),
"std::time::Duration" => Some("u64"),
"std::io::Error" => Some("crate::c_types::IOError"),
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"
+ "bech32::u5" => Some("crate::c_types::u5"),
+
+ "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
=> Some("crate::c_types::PublicKey"),
"bitcoin::secp256k1::Signature" => Some("crate::c_types::Signature"),
"bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
if is_ref => Some("*const [u8; 32]"),
"bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
if !is_ref => Some("crate::c_types::SecretKey"),
- "bitcoin::secp256k1::Error" if !is_ref => Some("crate::c_types::Secp256k1Error"),
+ "bitcoin::secp256k1::Error"|"secp256k1::Error"
+ if !is_ref => Some("crate::c_types::Secp256k1Error"),
"bitcoin::blockdata::script::Script" if is_ref => Some("crate::c_types::u8slice"),
"bitcoin::blockdata::script::Script" if !is_ref => Some("crate::c_types::derived::CVec_u8Z"),
"bitcoin::blockdata::transaction::OutPoint" => Some("crate::lightning::chain::transaction::OutPoint"),
"bitcoin::blockdata::block::Block" if is_ref => Some("crate::c_types::u8slice"),
// Newtypes that we just expose in their original form.
- "bitcoin::hash_types::Txid" if is_ref => Some("*const [u8; 32]"),
- "bitcoin::hash_types::Txid" if !is_ref => Some("crate::c_types::ThirtyTwoBytes"),
- "bitcoin::hash_types::BlockHash" if is_ref => Some("*const [u8; 32]"),
- "bitcoin::hash_types::BlockHash" if !is_ref => Some("crate::c_types::ThirtyTwoBytes"),
+ "bitcoin::hash_types::Txid"|"bitcoin::hash_types::BlockHash"|"bitcoin_hashes::sha256::Hash"
+ if is_ref => Some("*const [u8; 32]"),
+ "bitcoin::hash_types::Txid"|"bitcoin::hash_types::BlockHash"|"bitcoin_hashes::sha256::Hash"
+ if !is_ref => Some("crate::c_types::ThirtyTwoBytes"),
"bitcoin::secp256k1::Message" if !is_ref => Some("crate::c_types::ThirtyTwoBytes"),
"lightning::ln::channelmanager::PaymentHash" if is_ref => Some("*const [u8; 32]"),
"lightning::ln::channelmanager::PaymentHash" if !is_ref => Some("crate::c_types::ThirtyTwoBytes"),
"[u8; 32]" if is_ref => Some("unsafe { &*"),
"[u8; 32]" if !is_ref => Some(""),
+ "[u8; 20]" if !is_ref => Some(""),
"[u8; 16]" if !is_ref => Some(""),
"[u8; 10]" if !is_ref => Some(""),
"[u8; 4]" if !is_ref => Some(""),
"std::time::Duration" => Some("std::time::Duration::from_secs("),
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"
+ "bech32::u5" => Some(""),
+
+ "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
if is_ref => Some("&"),
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"
+ "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
=> Some(""),
"bitcoin::secp256k1::Signature" if is_ref => Some("&"),
"bitcoin::secp256k1::Signature" => Some(""),
"[u8; 32]" if is_ref => Some("}"),
"[u8; 32]" if !is_ref => Some(".data"),
+ "[u8; 20]" if !is_ref => Some(".data"),
"[u8; 16]" if !is_ref => Some(".data"),
"[u8; 10]" if !is_ref => Some(".data"),
"[u8; 4]" if !is_ref => Some(".data"),
"std::time::Duration" => Some(")"),
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"
+ "bech32::u5" => Some(".into()"),
+
+ "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
=> Some(".into_rust()"),
"bitcoin::secp256k1::Signature" => Some(".into_rust()"),
"bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
"[u8; 32]" if !is_ref => Some("crate::c_types::ThirtyTwoBytes { data: "),
"[u8; 32]" if is_ref => Some(""),
+ "[u8; 20]" if !is_ref => Some("crate::c_types::TwentyBytes { data: "),
"[u8; 16]" if !is_ref => Some("crate::c_types::SixteenBytes { data: "),
"[u8; 10]" if !is_ref => Some("crate::c_types::TenBytes { data: "),
"[u8; 4]" if !is_ref => Some("crate::c_types::FourBytes { data: "),
"std::time::Duration" => Some(""),
"std::io::Error" if !is_ref => Some("crate::c_types::IOError::from_rust("),
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"
+ "bech32::u5" => Some(""),
+
+ "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
=> Some("crate::c_types::PublicKey::from_rust(&"),
"bitcoin::secp256k1::Signature" => Some("crate::c_types::Signature::from_rust(&"),
"bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
if is_ref => Some(""),
"bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
if !is_ref => Some("crate::c_types::SecretKey::from_rust("),
- "bitcoin::secp256k1::Error" if !is_ref => Some("crate::c_types::Secp256k1Error::from_rust("),
+ "bitcoin::secp256k1::Error"|"secp256k1::Error"
+ if !is_ref => Some("crate::c_types::Secp256k1Error::from_rust("),
"bitcoin::blockdata::script::Script" if is_ref => Some("crate::c_types::u8slice::from_slice(&"),
"bitcoin::blockdata::script::Script" if !is_ref => Some(""),
"bitcoin::blockdata::transaction::Transaction" if is_ref => Some("crate::c_types::Transaction::from_bitcoin("),
"bitcoin::hash_types::Txid" if !is_ref => Some("crate::c_types::ThirtyTwoBytes { data: "),
// Newtypes that we just expose in their original form.
- "bitcoin::hash_types::Txid" if is_ref => Some(""),
- "bitcoin::hash_types::BlockHash" if is_ref => Some(""),
- "bitcoin::hash_types::BlockHash" => Some("crate::c_types::ThirtyTwoBytes { data: "),
+ "bitcoin::hash_types::Txid"|"bitcoin::hash_types::BlockHash"|"bitcoin_hashes::sha256::Hash"
+ if is_ref => Some(""),
+ "bitcoin::hash_types::Txid"|"bitcoin::hash_types::BlockHash"|"bitcoin_hashes::sha256::Hash"
+ if !is_ref => Some("crate::c_types::ThirtyTwoBytes { data: "),
"bitcoin::secp256k1::Message" if !is_ref => Some("crate::c_types::ThirtyTwoBytes { data: "),
"lightning::ln::channelmanager::PaymentHash" if is_ref => Some("&"),
"lightning::ln::channelmanager::PaymentHash" if !is_ref => Some("crate::c_types::ThirtyTwoBytes { data: "),
"[u8; 32]" if !is_ref => Some(" }"),
"[u8; 32]" if is_ref => Some(""),
+ "[u8; 20]" if !is_ref => Some(" }"),
"[u8; 16]" if !is_ref => Some(" }"),
"[u8; 10]" if !is_ref => Some(" }"),
"[u8; 4]" if !is_ref => Some(" }"),
"std::time::Duration" => Some(".as_secs()"),
"std::io::Error" if !is_ref => Some(")"),
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"
+ "bech32::u5" => Some(".into()"),
+
+ "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
=> Some(")"),
"bitcoin::secp256k1::Signature" => Some(")"),
"bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
if !is_ref => Some(")"),
"bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
if is_ref => Some(".as_ref()"),
- "bitcoin::secp256k1::Error" if !is_ref => Some(")"),
+ "bitcoin::secp256k1::Error"|"secp256k1::Error"
+ if !is_ref => Some(")"),
"bitcoin::blockdata::script::Script" if is_ref => Some("[..])"),
"bitcoin::blockdata::script::Script" if !is_ref => Some(".into_bytes().into()"),
"bitcoin::blockdata::transaction::Transaction" => Some(")"),
"bitcoin::hash_types::Txid" if !is_ref => Some(".into_inner() }"),
// Newtypes that we just expose in their original form.
- "bitcoin::hash_types::Txid" if is_ref => Some(".as_inner()"),
- "bitcoin::hash_types::BlockHash" if is_ref => Some(".as_inner()"),
- "bitcoin::hash_types::BlockHash" => Some(".into_inner() }"),
+ "bitcoin::hash_types::Txid"|"bitcoin::hash_types::BlockHash"|"bitcoin_hashes::sha256::Hash"
+ if is_ref => Some(".as_inner()"),
+ "bitcoin::hash_types::Txid"|"bitcoin::hash_types::BlockHash"|"bitcoin_hashes::sha256::Hash"
+ if !is_ref => Some(".into_inner() }"),
"bitcoin::secp256k1::Message" if !is_ref => Some(".as_ref().clone() }"),
"lightning::ln::channelmanager::PaymentHash" if is_ref => Some(".0"),
"lightning::ln::channelmanager::PaymentHash" => Some(".0 }"),
fn empty_val_check_suffix_from_path(&self, full_path: &str) -> Option<&str> {
match full_path {
"lightning::ln::channelmanager::PaymentSecret" => Some(".data == [0; 32]"),
- "bitcoin::secp256k1::key::PublicKey" => Some(".is_null()"),
+ "secp256k1::key::PublicKey"|"bitcoin::secp256k1::key::PublicKey" => Some(".is_null()"),
"bitcoin::secp256k1::Signature" => Some(".is_null()"),
_ => None
}
"Vec" if !is_ref => {
Some(("Vec::new(); for mut item in ", vec![(format!(".drain(..) {{ local_{}.push(", var_name), "item".to_string())], "); }", ContainerPrefixLocation::PerConv))
},
+ "Vec" => {
+ // We should only get here if the single contained has an inner
+ assert!(self.c_type_has_inner(single_contained.unwrap()));
+ Some(("Vec::new(); for mut item in ", vec![(format!(".drain(..) {{ local_{}.push(", var_name), "*item".to_string())], "); }", ContainerPrefixLocation::PerConv))
+ },
"Slice" => {
Some(("Vec::new(); for item in ", vec![(format!(".iter() {{ local_{}.push(", var_name), "*item".to_string())], "); }", ContainerPrefixLocation::PerConv))
},
self.types.get_declared_type(ident)
}
/// Returns true if the object at the given path is mapped as X { inner: *mut origX, .. }.
- pub fn c_type_has_inner_from_path(&self, full_path: &str) -> bool{
+ pub fn c_type_has_inner_from_path(&self, full_path: &str) -> bool {
self.crate_types.opaques.get(full_path).is_some()
}
+ /// Returns true if the object at the given path is mapped as X { inner: *mut origX, .. }.
+ pub fn c_type_has_inner(&self, ty: &syn::Type) -> bool {
+ match ty {
+ syn::Type::Path(p) => {
+ let full_path = self.resolve_path(&p.path, None);
+ self.c_type_has_inner_from_path(&full_path)
+ },
+ _ => false,
+ }
+ }
pub fn maybe_resolve_ident(&self, id: &syn::Ident) -> Option<String> {
self.types.maybe_resolve_ident(id)