98 lines
2.4 KiB
Rust
98 lines
2.4 KiB
Rust
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<T: Monad> Diagnostic<T> 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<TypelessError<'a>> for TestLookupError<'a> {
|
|
fn from(value: TypelessError<'a>) -> Self {
|
|
Self::Typeless(value)
|
|
}
|
|
}
|
|
|
|
impl<'a> From<CastError<'a>> 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<Self>, address: Address) -> HashResolution<'a, TestContextPlain> {
|
|
Err(TestLookupError::EmptyResolverAccess(address))
|
|
}
|
|
}
|
|
|
|
pub fn reparse<'a, A: Mentionable<'a, TestContextPlain>>(mentionable: Rc<A>) -> A {
|
|
let factory = mentionable.factory();
|
|
TypelessMentionable::from_typed(mentionable)
|
|
.cast(factory)
|
|
.expect("cast failed")
|
|
}
|