geam 0.1.2

Experimental Rust-embedded execution runtime for typed Gleam programs
use ecow::EcoString;
use thiserror::Error;

mod host;
mod invalid;
mod unsupported;

pub use host::{ExternalTypeProviderLinkReason, HostProviderLinkReason};
pub use invalid::{
    InvalidBitArraySegmentOptionsReason, InvalidCallShapeReason, InvalidCaseShapeReason,
    InvalidCustomTypeReason, InvalidExpressionShapeKind, InvalidExpressionType,
    InvalidFunctionShapeReason, InvalidModuleReferenceReason, InvalidPatternShapeReason,
    InvalidPipelineShapeReason, InvalidRecordUpdateShapeReason, InvalidTypedAstReason,
    InvalidUseShapeReason, PatternKind, RecordUpdateArgumentOrigin,
};
pub use unsupported::{
    UnsupportedBitArraySegmentReason, UnsupportedFunctionReason, UnsupportedPatternKind,
    UnsupportedTopLevelKind,
};

#[derive(Debug, Error, Clone, PartialEq, Eq)]
pub enum PlanError {
    #[error("external type provider {package}::{module}.{type_}: {reason}")]
    ExternalTypeProviderLink {
        package: EcoString,
        module: EcoString,
        type_: EcoString,
        reason: Box<ExternalTypeProviderLinkReason>,
    },

    #[error("host provider {package}::{module}.{function}: {reason}")]
    HostProviderLink {
        package: EcoString,
        module: EcoString,
        function: EcoString,
        reason: Box<HostProviderLinkReason>,
    },

    #[error("external function {package}::{module}.{function} has no host provider or Gleam body")]
    MissingHostProvider {
        package: EcoString,
        module: EcoString,
        function: EcoString,
    },

    #[error("unsupported top-level definition: {kind}")]
    UnsupportedTopLevel { kind: UnsupportedTopLevelKind },

    #[error("unsupported function {name}: {reason}")]
    UnsupportedFunction {
        name: EcoString,
        reason: UnsupportedFunctionReason,
    },

    #[error("unsupported pattern: {kind}")]
    UnsupportedPattern { kind: UnsupportedPatternKind },

    #[error("unsupported bit array segment: {reason}")]
    UnsupportedBitArraySegment {
        reason: UnsupportedBitArraySegmentReason,
    },

    #[error("invalid Gleam typed AST: {reason}")]
    InvalidTypedAst { reason: InvalidTypedAstReason },
}