diff --git a/src/std/cast.rs b/src/std/cast.rs index 70c26e0..4220675 100644 --- a/src/std/cast.rs +++ b/src/std/cast.rs @@ -5,17 +5,34 @@ struct CastResolver<'a, Ctx: 'a + Context> { points: Vec>>, } +pub enum CastError<'a> { + Typeless(TypelessError<'a>), + AddressIndexOutOfBounds(usize), + AddressPointMismatch { + expected: Hash, + received: Hash, + index: usize, + }, +} + impl<'a, Ctx: 'a + Context> Resolver<'a, Ctx> for CastResolver<'a, Ctx> where - Ctx::LookupError: From>, + Ctx::LookupError: From>, { fn resolve(self: Rc, address: Address) -> HashResolution<'a, Ctx> { - let point = &self - .points - .get(address.index) - .expect("CastResolved received an invalid address."); + let point = match self.points.get(address.index) { + Some(point) => point, + None => { + return Ctx::T::pure(Err(CastError::AddressIndexOutOfBounds(address.index).into())); + } + }; if point.point != address.point { - panic!("CastResolved received an invalid address.") + return Ctx::T::pure(Err(CastError::AddressPointMismatch { + expected: point.point, + received: address.point, + index: address.index, + } + .into())); } Ctx::T::fmap( |resolved| match resolved { @@ -29,7 +46,7 @@ where } Err(error) => Err(match error { ResolutionError::Lookup(lookup_error) => lookup_error, - ResolutionError::Parse(parse_error) => parse_error.into(), + ResolutionError::Parse(parse_error) => CastError::Typeless(parse_error).into(), }), }, point.resolve(), @@ -41,7 +58,7 @@ pub type CastResult<'a, Ctx, A> = Result>::Fctr as Factory<'a, Ctx>>::ParseError>; impl<'a, Ctx: Context> TypelessMentionable<'a, Ctx> where - Ctx::LookupError: From>, + Ctx::LookupError: From>, { /// . ///