aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Fischer <martin@push-f.com>2021-11-22 11:42:07 +0100
committerMartin Fischer <martin@push-f.com>2021-11-22 11:42:07 +0100
commit7384c11750e9971770683861f7cd5f719c487ce9 (patch)
tree91bceba6b77ff84b04363a6976284df3023e8e9d
parent5c6f0d3510517d867c27e9a658e5015fb9b3d5ef (diff)
refactor: make MethodError wrap TransformError
-rw-r--r--src/lib.rs5
-rw-r--r--src/parse_trait_sig.rs34
-rw-r--r--src/transform.rs8
3 files changed, 25 insertions, 22 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 1fd5988..02b150e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -44,6 +44,7 @@ use crate::parse_trait_sig::SignatureChanges;
use crate::parse_trait_sig::TypeTransform;
use crate::syn_utils::iter_path;
use crate::syn_utils::trait_bounds;
+use crate::transform::TransformError;
use crate::transform::TypeConverter;
mod parse_assoc_type;
@@ -95,7 +96,7 @@ pub fn dynamize(_attr: TokenStream, input: TokenStream) -> TokenStream {
let mut signature = method.sig.clone();
match parse_trait_signature(&mut signature, &type_converter) {
Err((_, MethodError::NonDispatchableMethod)) => continue,
- Err((span, MethodError::AssocTypeWithoutDestType)) => {
+ Err((span, MethodError::Transform(TransformError::AssocTypeWithoutDestType))) => {
return abort!(
span,
"associated type is either undefined or doesn't have a trait bound"
@@ -107,7 +108,7 @@ pub fn dynamize(_attr: TokenStream, input: TokenStream) -> TokenStream {
"dynamize does not support associated types in parameter types"
)
}
- Err((span, MethodError::UnsupportedType)) => {
+ Err((span, MethodError::Transform(TransformError::UnsupportedType))) => {
return abort!(span, "dynamize does not know how to convert this type")
}
Err((span, MethodError::UnconvertedAssocType)) => {
diff --git a/src/parse_trait_sig.rs b/src/parse_trait_sig.rs
index aff4fe9..dfe3ce7 100644
--- a/src/parse_trait_sig.rs
+++ b/src/parse_trait_sig.rs
@@ -28,13 +28,17 @@ pub enum MethodError {
AssocTypeInInputs,
ImplTraitInInputs,
- // TODO: wrap TransformError
- AssocTypeWithoutDestType,
- UnsupportedType,
+ Transform(TransformError),
UnconvertedAssocType,
}
+impl From<TransformError> for MethodError {
+ fn from(err: TransformError) -> Self {
+ Self::Transform(err)
+ }
+}
+
fn filter_map_impl_trait(item: TypeOrPath) -> Option<&TypeImplTrait> {
match item {
TypeOrPath::Type(Type::ImplTrait(impltrait)) => Some(impltrait),
@@ -72,11 +76,8 @@ pub fn parse_trait_signature(
let return_type = match &mut signature.output {
ReturnType::Type(_, og_type) => match type_converter.convert_type(og_type) {
Ok(ret_type) => ret_type,
- Err((span, TransformError::AssocTypeWithoutDestType)) => {
- return Err((span, MethodError::AssocTypeWithoutDestType));
- }
- Err((span, TransformError::UnsupportedType)) => {
- return Err((span, MethodError::UnsupportedType));
+ Err((span, err)) => {
+ return Err((span, err.into()));
}
},
ReturnType::Default => TypeTransform::NoOp,
@@ -144,7 +145,7 @@ mod tests {
use crate::{
parse_assoc_type::DestType,
parse_trait_sig::{parse_trait_signature, MethodError, SignatureChanges, TypeTransform},
- transform::TypeConverter,
+ transform::{TransformError, TypeConverter},
};
#[test]
@@ -194,7 +195,10 @@ mod tests {
assert!(matches!(
parse_trait_signature(&mut type1.sig, &Default::default()),
- Err((_, MethodError::AssocTypeWithoutDestType))
+ Err((
+ _,
+ MethodError::Transform(TransformError::AssocTypeWithoutDestType)
+ ))
));
}
@@ -259,7 +263,7 @@ mod tests {
assert!(matches!(
parse_trait_signature(&mut type1.sig, &Default::default()),
- Err((_, MethodError::UnsupportedType))
+ Err((_, MethodError::Transform(TransformError::UnsupportedType)))
));
}
@@ -272,7 +276,7 @@ mod tests {
assert!(matches!(
parse_trait_signature(&mut type1.sig, &Default::default()),
- Err((_, MethodError::UnsupportedType))
+ Err((_, MethodError::Transform(TransformError::UnsupportedType)))
));
}
@@ -285,7 +289,7 @@ mod tests {
assert!(matches!(
parse_trait_signature(&mut type1.sig, &Default::default()),
- Err((_, MethodError::UnsupportedType))
+ Err((_, MethodError::Transform(TransformError::UnsupportedType)))
));
}
@@ -298,7 +302,7 @@ mod tests {
assert!(matches!(
parse_trait_signature(&mut type1.sig, &Default::default()),
- Err((_, MethodError::UnsupportedType))
+ Err((_, MethodError::Transform(TransformError::UnsupportedType)))
));
}
@@ -350,7 +354,7 @@ mod tests {
assert!(matches!(
parse_trait_signature(&mut type1.sig, &Default::default()),
- Err((_, MethodError::UnsupportedType))
+ Err((_, MethodError::Transform(TransformError::UnsupportedType)))
));
}
}
diff --git a/src/transform.rs b/src/transform.rs
index 13cf519..4649037 100644
--- a/src/transform.rs
+++ b/src/transform.rs
@@ -19,6 +19,7 @@ pub struct TypeConverter<'a> {
pub assoc_type_conversions: HashMap<Ident, DestType<'a>>,
}
+#[derive(Debug)]
pub enum TransformError {
AssocTypeWithoutDestType,
UnsupportedType,
@@ -237,11 +238,8 @@ fn dynamize_trait_bound(
Ok(ret_type) => {
transforms.push(ret_type);
}
- Err((span, TransformError::AssocTypeWithoutDestType)) => {
- return Err((span, MethodError::AssocTypeWithoutDestType));
- }
- Err((span, TransformError::UnsupportedType)) => {
- return Err((span, MethodError::UnsupportedType));
+ Err((span, err)) => {
+ return Err((span, err.into()));
}
}
}