|
@@ -39,17 +39,17 @@ impl<'a> TyInfo<'a> {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-pub fn parse_ty<'a>(ctxt: &Ctxt, ty: &'a syn::Type) -> Option<TyInfo<'a>> {
|
|
|
|
|
|
+pub fn parse_ty<'a>(ctxt: &Ctxt, ty: &'a syn::Type) -> Result<Option<TyInfo<'a>>, String> {
|
|
// Type -> TypePath -> Path -> PathSegment -> PathArguments ->
|
|
// Type -> TypePath -> Path -> PathSegment -> PathArguments ->
|
|
// AngleBracketedGenericArguments -> GenericArgument -> Type.
|
|
// AngleBracketedGenericArguments -> GenericArgument -> Type.
|
|
if let syn::Type::Path(ref p) = ty {
|
|
if let syn::Type::Path(ref p) = ty {
|
|
if p.path.segments.len() != 1 {
|
|
if p.path.segments.len() != 1 {
|
|
- return None;
|
|
|
|
|
|
+ return Ok(None);
|
|
}
|
|
}
|
|
|
|
|
|
let seg = match p.path.segments.last() {
|
|
let seg = match p.path.segments.last() {
|
|
Some(seg) => seg,
|
|
Some(seg) => seg,
|
|
- None => return None,
|
|
|
|
|
|
+ None => return Ok(None),
|
|
};
|
|
};
|
|
|
|
|
|
let _is_option = seg.ident == "Option";
|
|
let _is_option = seg.ident == "Option";
|
|
@@ -60,20 +60,20 @@ pub fn parse_ty<'a>(ctxt: &Ctxt, ty: &'a syn::Type) -> Option<TyInfo<'a>> {
|
|
"Vec" => generate_vec_ty_info(ctxt, seg, bracketed),
|
|
"Vec" => generate_vec_ty_info(ctxt, seg, bracketed),
|
|
"Option" => generate_option_ty_info(ctxt, ty, seg, bracketed),
|
|
"Option" => generate_option_ty_info(ctxt, ty, seg, bracketed),
|
|
_ => {
|
|
_ => {
|
|
- panic!("Unsupported ty {}", seg.ident.to_string())
|
|
|
|
|
|
+ return Err(format!("Unsupported ty {}", seg.ident.to_string()));
|
|
},
|
|
},
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- return Some(TyInfo {
|
|
|
|
|
|
+ return Ok(Some(TyInfo {
|
|
ident: &seg.ident,
|
|
ident: &seg.ident,
|
|
ty,
|
|
ty,
|
|
primitive_ty: PrimitiveTy::Other,
|
|
primitive_ty: PrimitiveTy::Other,
|
|
bracket_ty_info: Box::new(None),
|
|
bracket_ty_info: Box::new(None),
|
|
- });
|
|
|
|
|
|
+ }));
|
|
};
|
|
};
|
|
}
|
|
}
|
|
ctxt.error_spanned_by(ty, "Unsupported inner type, get inner type fail".to_string());
|
|
ctxt.error_spanned_by(ty, "Unsupported inner type, get inner type fail".to_string());
|
|
- None
|
|
|
|
|
|
+ Ok(None)
|
|
}
|
|
}
|
|
|
|
|
|
fn parse_bracketed(bracketed: &AngleBracketedGenericArguments) -> Vec<&syn::Type> {
|
|
fn parse_bracketed(bracketed: &AngleBracketedGenericArguments) -> Vec<&syn::Type> {
|
|
@@ -95,21 +95,21 @@ pub fn generate_hashmap_ty_info<'a>(
|
|
ty: &'a syn::Type,
|
|
ty: &'a syn::Type,
|
|
path_segment: &'a PathSegment,
|
|
path_segment: &'a PathSegment,
|
|
bracketed: &'a AngleBracketedGenericArguments,
|
|
bracketed: &'a AngleBracketedGenericArguments,
|
|
-) -> Option<TyInfo<'a>> {
|
|
|
|
|
|
+) -> Result<Option<TyInfo<'a>>, String> {
|
|
// The args of map must greater than 2
|
|
// The args of map must greater than 2
|
|
if bracketed.args.len() != 2 {
|
|
if bracketed.args.len() != 2 {
|
|
- return None;
|
|
|
|
|
|
+ return Ok(None);
|
|
}
|
|
}
|
|
let types = parse_bracketed(bracketed);
|
|
let types = parse_bracketed(bracketed);
|
|
- let key = parse_ty(ctxt, types[0]).unwrap().ident.to_string();
|
|
|
|
- let value = parse_ty(ctxt, types[1]).unwrap().ident.to_string();
|
|
|
|
- let bracket_ty_info = Box::new(parse_ty(ctxt, &types[1]));
|
|
|
|
- Some(TyInfo {
|
|
|
|
|
|
+ let key = parse_ty(ctxt, types[0])?.unwrap().ident.to_string();
|
|
|
|
+ let value = parse_ty(ctxt, types[1])?.unwrap().ident.to_string();
|
|
|
|
+ let bracket_ty_info = Box::new(parse_ty(ctxt, &types[1])?);
|
|
|
|
+ Ok(Some(TyInfo {
|
|
ident: &path_segment.ident,
|
|
ident: &path_segment.ident,
|
|
ty,
|
|
ty,
|
|
primitive_ty: PrimitiveTy::Map(MapInfo::new(key, value)),
|
|
primitive_ty: PrimitiveTy::Map(MapInfo::new(key, value)),
|
|
bracket_ty_info,
|
|
bracket_ty_info,
|
|
- })
|
|
|
|
|
|
+ }))
|
|
}
|
|
}
|
|
|
|
|
|
fn generate_option_ty_info<'a>(
|
|
fn generate_option_ty_info<'a>(
|
|
@@ -117,34 +117,34 @@ fn generate_option_ty_info<'a>(
|
|
ty: &'a syn::Type,
|
|
ty: &'a syn::Type,
|
|
path_segment: &'a PathSegment,
|
|
path_segment: &'a PathSegment,
|
|
bracketed: &'a AngleBracketedGenericArguments,
|
|
bracketed: &'a AngleBracketedGenericArguments,
|
|
-) -> Option<TyInfo<'a>> {
|
|
|
|
|
|
+) -> Result<Option<TyInfo<'a>>, String> {
|
|
assert_eq!(path_segment.ident.to_string(), "Option".to_string());
|
|
assert_eq!(path_segment.ident.to_string(), "Option".to_string());
|
|
let types = parse_bracketed(bracketed);
|
|
let types = parse_bracketed(bracketed);
|
|
- let bracket_ty_info = Box::new(parse_ty(ctxt, &types[0]));
|
|
|
|
- Some(TyInfo {
|
|
|
|
|
|
+ let bracket_ty_info = Box::new(parse_ty(ctxt, &types[0])?);
|
|
|
|
+ Ok(Some(TyInfo {
|
|
ident: &path_segment.ident,
|
|
ident: &path_segment.ident,
|
|
ty,
|
|
ty,
|
|
primitive_ty: PrimitiveTy::Opt,
|
|
primitive_ty: PrimitiveTy::Opt,
|
|
bracket_ty_info,
|
|
bracket_ty_info,
|
|
- })
|
|
|
|
|
|
+ }))
|
|
}
|
|
}
|
|
|
|
|
|
fn generate_vec_ty_info<'a>(
|
|
fn generate_vec_ty_info<'a>(
|
|
ctxt: &Ctxt,
|
|
ctxt: &Ctxt,
|
|
path_segment: &'a PathSegment,
|
|
path_segment: &'a PathSegment,
|
|
bracketed: &'a AngleBracketedGenericArguments,
|
|
bracketed: &'a AngleBracketedGenericArguments,
|
|
-) -> Option<TyInfo<'a>> {
|
|
|
|
|
|
+) -> Result<Option<TyInfo<'a>>, String> {
|
|
if bracketed.args.len() != 1 {
|
|
if bracketed.args.len() != 1 {
|
|
- return None;
|
|
|
|
|
|
+ return Ok(None);
|
|
}
|
|
}
|
|
if let syn::GenericArgument::Type(ref bracketed_type) = bracketed.args.first().unwrap() {
|
|
if let syn::GenericArgument::Type(ref bracketed_type) = bracketed.args.first().unwrap() {
|
|
- let bracketed_ty_info = Box::new(parse_ty(ctxt, &bracketed_type));
|
|
|
|
- return Some(TyInfo {
|
|
|
|
|
|
+ let bracketed_ty_info = Box::new(parse_ty(ctxt, &bracketed_type)?);
|
|
|
|
+ return Ok(Some(TyInfo {
|
|
ident: &path_segment.ident,
|
|
ident: &path_segment.ident,
|
|
ty: bracketed_type,
|
|
ty: bracketed_type,
|
|
primitive_ty: PrimitiveTy::Vec,
|
|
primitive_ty: PrimitiveTy::Vec,
|
|
bracket_ty_info: bracketed_ty_info,
|
|
bracket_ty_info: bracketed_ty_info,
|
|
- });
|
|
|
|
|
|
+ }));
|
|
}
|
|
}
|
|
- None
|
|
|
|
|
|
+ Ok(None)
|
|
}
|
|
}
|