pub mod counted; pub mod traced; use std::{error::Error, fmt::Display, rc::Rc}; use sha2::{Digest, Sha256}; use crate::core::*; use crate::func::*; use crate::std::cast::*; pub struct NoDiagnostic; impl Diagnostic for NoDiagnostic { fn after<'a, A>(fa: T::F<'a, A>, _event: &'a str) -> T::F<'a, A> { fa } fn before<'a, A>(fa: T::F<'a, A>, _event: &'a str) -> T::F<'a, A> { fa } fn wrapped<'a, A>(fa: T::F<'a, A>, _event: &'a str) -> T::F<'a, A> { fa } } pub struct TestContextPlain; #[derive(Debug)] pub enum TestLookupError<'a> { Typeless(TypelessError<'a>), Cast(CastError<'a>), EmptyResolverAccess(Address), } impl<'a> From> for TestLookupError<'a> { fn from(value: TypelessError<'a>) -> Self { Self::Typeless(value) } } impl<'a> From> for TestLookupError<'a> { fn from(value: CastError<'a>) -> Self { Self::Cast(value) } } impl<'a> Display for TestLookupError<'a> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { TestLookupError::Typeless(typeless_error) => { f.write_fmt(format_args!("typeless lookup failure: {}", typeless_error)) } TestLookupError::Cast(cast_error) => { f.write_fmt(format_args!("cast failure: {}", cast_error)) } TestLookupError::EmptyResolverAccess(address) => f.write_fmt(format_args!( "accessed an empty resolved at address {}.", address )), } } } impl<'a> Error for TestLookupError<'a> {} impl Context for TestContextPlain { type T = classes::solo::SoloClass; type Fallible = classes::result::ResultFailAny; type D = NoDiagnostic; type LookupError<'a> = TestLookupError<'a>; fn hash(s: &[u8]) -> Hash { let mut hasher = Sha256::new(); hasher.update(s); hasher.finalize().into() } } pub struct EmptyResolver; impl<'a> Resolver<'a, TestContextPlain> for EmptyResolver { fn resolve(self: std::rc::Rc, address: Address) -> HashResolution<'a, TestContextPlain> { Err(TestLookupError::EmptyResolverAccess(address)) } } pub fn reparse<'a, A: Mentionable<'a, TestContextPlain>>(mentionable: Rc) -> A { let factory = mentionable.factory(); TypelessMentionable::from_typed(mentionable) .cast(factory) .expect("cast failed") }