Parse Result return type
diff --git a/syntax/parse.rs b/syntax/parse.rs
index 67bb52b..7bae707 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -178,13 +178,34 @@
}
}
}
+
+ let mut throws = false;
let ret = match &foreign_fn.sig.output {
ReturnType::Default => None,
- ReturnType::Type(_, ty) => match parse_type(ty)? {
- Type::Void(_) => None,
- ty => Some(ty),
- },
+ ReturnType::Type(_, ret) => {
+ let mut ret = ret.as_ref();
+ if let RustType::Path(ty) = ret {
+ let path = &ty.path;
+ if ty.qself.is_none() && path.leading_colon.is_none() && path.segments.len() == 1 {
+ let segment = &path.segments[0];
+ let ident = segment.ident.clone();
+ if let PathArguments::AngleBracketed(generic) = &segment.arguments {
+ if ident == "Result" && generic.args.len() == 1 {
+ if let GenericArgument::Type(arg) = &generic.args[0] {
+ ret = arg;
+ throws = true;
+ }
+ }
+ }
+ }
+ }
+ match parse_type(ret)? {
+ Type::Void(_) => None,
+ ty => Some(ty),
+ }
+ }
};
+
let doc = attrs::parse_doc(&foreign_fn.attrs)?;
let fn_token = foreign_fn.sig.fn_token;
let ident = foreign_fn.sig.ident.clone();
@@ -196,12 +217,13 @@
receiver,
args,
ret,
+ throws,
semi_token,
})
}
fn parse_type(ty: &RustType) -> Result<Type> {
- match &ty {
+ match ty {
RustType::Reference(ty) => {
let inner = parse_type(&ty.elem)?;
let which = match &inner {