From d6f01bd571753dc2e9628418f94f66139438bcb3 Mon Sep 17 00:00:00 2001 From: HampusM Date: Tue, 30 Aug 2022 18:53:23 +0200 Subject: refactor: replace arc cast panic with an error --- src/libs/intertrait/cast/arc.rs | 21 ++++++++++++++------- src/libs/intertrait/cast/box.rs | 4 ++-- src/libs/intertrait/cast/error.rs | 3 +++ src/libs/intertrait/cast/rc.rs | 4 ++-- 4 files changed, 21 insertions(+), 11 deletions(-) (limited to 'src/libs/intertrait/cast') diff --git a/src/libs/intertrait/cast/arc.rs b/src/libs/intertrait/cast/arc.rs index 94c0482..33d84d2 100644 --- a/src/libs/intertrait/cast/arc.rs +++ b/src/libs/intertrait/cast/arc.rs @@ -13,7 +13,7 @@ use std::any::type_name; use std::sync::Arc; use crate::libs::intertrait::cast::error::CastError; -use crate::libs::intertrait::{caster, CastFromSync}; +use crate::libs::intertrait::{get_caster, CastFromSync}; pub trait CastArc { @@ -31,12 +31,19 @@ impl CastArc for CastFromSelf self: Arc, ) -> Result, CastError> { - match caster::((*self).type_id()) { - Some(caster) => Ok((caster.cast_arc)(self.arc_any())), - None => Err(CastError::CastFailed { - from: type_name::(), - to: type_name::(), - }), + let caster = get_caster::((*self).type_id()).map_or_else( + || { + Err(CastError::CastFailed { + from: type_name::(), + to: type_name::(), + }) + }, + Ok, + )?; + + match caster.opt_cast_arc { + Some(cast_arc) => Ok(cast_arc(self.arc_any())), + None => Err(CastError::NotArcCastable(type_name::())), } } } diff --git a/src/libs/intertrait/cast/box.rs b/src/libs/intertrait/cast/box.rs index 31f06db..c463c2f 100644 --- a/src/libs/intertrait/cast/box.rs +++ b/src/libs/intertrait/cast/box.rs @@ -13,7 +13,7 @@ use std::any::type_name; use crate::libs::intertrait::cast::error::CastError; -use crate::libs::intertrait::{caster, CastFrom}; +use crate::libs::intertrait::{get_caster, CastFrom}; pub trait CastBox { @@ -30,7 +30,7 @@ impl CastBox for CastFromSelf self: Box, ) -> Result, CastError> { - match caster::((*self).type_id()) { + match get_caster::((*self).type_id()) { Some(caster) => Ok((caster.cast_box)(self.box_any())), None => Err(CastError::CastFailed { from: type_name::(), diff --git a/src/libs/intertrait/cast/error.rs b/src/libs/intertrait/cast/error.rs index 74eb3ca..a834c05 100644 --- a/src/libs/intertrait/cast/error.rs +++ b/src/libs/intertrait/cast/error.rs @@ -7,4 +7,7 @@ pub enum CastError from: &'static str, to: &'static str, }, + + #[error("Trait '{0}' can't be cast to Arc")] + NotArcCastable(&'static str), } diff --git a/src/libs/intertrait/cast/rc.rs b/src/libs/intertrait/cast/rc.rs index dfb71c2..63c0024 100644 --- a/src/libs/intertrait/cast/rc.rs +++ b/src/libs/intertrait/cast/rc.rs @@ -13,7 +13,7 @@ use std::any::type_name; use std::rc::Rc; use crate::libs::intertrait::cast::error::CastError; -use crate::libs::intertrait::{caster, CastFrom}; +use crate::libs::intertrait::{get_caster, CastFrom}; pub trait CastRc { @@ -30,7 +30,7 @@ impl CastRc for CastFromSelf self: Rc, ) -> Result, CastError> { - match caster::((*self).type_id()) { + match get_caster::((*self).type_id()) { Some(caster) => Ok((caster.cast_rc)(self.rc_any())), None => Err(CastError::CastFailed { from: type_name::(), -- cgit v1.2.3-18-g5258