geam 0.1.1

Experimental Rust-embedded execution runtime for typed Gleam programs
use crate::host::{HostCustomTypeSchema, HostExternalTypeSchema};
use crate::plan::{CustomTypeName, ExternalTypeName, FunctionType, TypeScheme};
use thiserror::Error;

#[derive(Debug, Error, Clone, PartialEq, Eq)]
pub enum ExternalTypeProviderLinkReason {
    #[error("source module is not linked")]
    MissingModule,
    #[error("external type registration is missing")]
    MissingRegistration,
    #[error("type declaration is missing")]
    MissingDeclaration,
    #[error("external storage type has source constructors")]
    ConstructorBackedType,
    #[error("external type identity mismatch: expected {expected:?}, got {actual:?}")]
    IdentityMismatch {
        expected: ExternalTypeName,
        actual: ExternalTypeName,
    },
    #[error("external type expects {expected} type arguments, but host ABI declares {actual}")]
    ParameterCount { expected: usize, actual: usize },
}

#[derive(Debug, Error, Clone, PartialEq, Eq)]
pub enum HostProviderLinkReason {
    #[error("source module is not linked")]
    MissingModule,
    #[error("function declaration is missing")]
    MissingDeclaration,
    #[error("function is not external")]
    NonExternalFunction,
    #[error(
        "function scheme mismatch: expected {expected_scheme:?} {expected_type:?}, got {actual_scheme:?} {actual_type:?}"
    )]
    SchemeMismatch {
        expected_scheme: TypeScheme,
        expected_type: FunctionType,
        actual_scheme: TypeScheme,
        actual_type: FunctionType,
    },
    #[error("custom type {custom_type:?} is missing")]
    MissingCustomType { custom_type: CustomTypeName },
    #[error("custom type {custom_type:?} is not visible to the host function")]
    CustomTypeVisibility { custom_type: CustomTypeName },
    #[error(
        "custom type {custom_type:?} expects {expected} type arguments, but host ABI applies {actual}"
    )]
    CustomTypeArgumentCount {
        custom_type: CustomTypeName,
        expected: usize,
        actual: usize,
    },
    #[error("custom schema mismatch: expected {expected:?}, got {actual:?}")]
    CustomSchemaMismatch {
        expected: HostCustomTypeSchema,
        actual: HostCustomTypeSchema,
    },
    #[error("external type {external_type:?} is missing")]
    MissingExternalType { external_type: ExternalTypeName },
    #[error(
        "external type {external_type:?} expects {expected} type arguments, but host ABI applies {actual}"
    )]
    ExternalTypeArgumentCount {
        external_type: ExternalTypeName,
        expected: usize,
        actual: usize,
    },
    #[error("external schema mismatch: expected {expected:?}, got {actual:?}")]
    ExternalSchemaMismatch {
        expected: HostExternalTypeSchema,
        actual: HostExternalTypeSchema,
    },
}