shdrlib 0.1.0

A three-tiered Vulkan shader compilation and rendering framework built in pure Rust
Documentation
//! Error types for the EX tier
//!
//! EX tier errors wrap CORE tier errors and add additional context specific to
//! manager operations.

use thiserror::Error;

/// Errors that can occur during RuntimeManager operations
#[derive(Error, Debug)]
pub enum RuntimeError {
    /// Instance creation failed
    #[error("Instance creation failed: {0}")]
    InstanceCreationFailed(#[from] crate::core::InstanceError),

    /// Device creation failed
    #[error("Device creation failed: {0}")]
    DeviceCreationFailed(#[from] crate::core::DeviceError),

    /// No graphics queue family found on selected device
    #[error("No graphics queue family found on selected device")]
    NoGraphicsQueue,

    /// No suitable physical device found
    #[error("No suitable physical device found (total devices: {0})")]
    NoSuitableDevice(usize),

    /// Fence operation failed
    #[error("Fence synchronization failed: {0}")]
    FenceSyncFailed(#[from] crate::core::FenceError),

    /// Semaphore creation failed
    #[error("Semaphore creation failed: {0}")]
    SemaphoreCreationFailed(#[from] crate::core::SemaphoreError),

    /// Command pool creation failed
    #[error("Command pool creation failed: {0}")]
    CommandPoolCreationFailed(#[from] crate::core::CommandPoolError),

    /// Command buffer operation failed
    #[error("Command buffer operation failed: {0}")]
    CommandBufferError(#[from] crate::core::CommandBufferError),

    /// Queue operation failed
    #[error("Queue operation failed: {0}")]
    QueueError(#[from] crate::core::QueueError),

    /// Other runtime errors (fallback for helper utilities)
    #[error("{0}")]
    Other(String),
}

/// Errors that can occur during ShaderManager operations
#[derive(Error, Debug)]
pub enum ShaderManagerError {
    /// Shader compilation failed
    #[error("Shader compilation failed: {0}")]
    ShaderCompilationFailed(#[from] crate::core::ShaderError),

    /// Pipeline creation failed (from CORE)
    #[error("Pipeline creation failed: {0}")]
    PipelineCreationFailed(#[from] crate::core::PipelineError),

    /// Pipeline builder error (from EX)
    #[error("Pipeline builder error: {0}")]
    PipelineBuilderError(#[from] PipelineError),

    /// Invalid shader ID provided
    #[error("Invalid shader ID: {0:?}")]
    InvalidShaderId(ShaderId),

    /// Invalid pipeline ID provided
    #[error("Invalid pipeline ID: {0:?}")]
    InvalidPipelineId(PipelineId),

    /// Descriptor pool creation failed
    #[error("Descriptor pool creation failed: {0}")]
    DescriptorPoolCreationFailed(#[from] crate::core::DescriptorPoolError),

    /// Descriptor operation failed
    #[error("Descriptor operation failed: {0}")]
    DescriptorError(#[from] crate::core::DescriptorError),
}

/// Errors that can occur during pipeline building
#[derive(Error, Debug)]
pub enum PipelineError {
    /// No vertex shader provided (required for graphics pipelines)
    #[error("No vertex shader provided - vertex shader is required for graphics pipelines")]
    NoVertexShader,

    /// No fragment shader provided (required for graphics pipelines)
    #[error("No fragment shader provided - fragment shader is required for graphics pipelines")]
    NoFragmentShader,

    /// No compute shader provided (required for compute pipelines)
    #[error("No compute shader provided - compute shader is required for compute pipelines")]
    NoComputeShader,

    /// Pipeline creation failed in CORE tier
    #[error("Pipeline creation failed: {0}")]
    CreationFailed(#[from] crate::core::PipelineError),

    /// Invalid descriptor set layout
    #[error("Invalid descriptor set layout configuration")]
    InvalidDescriptorLayout,

    /// No color attachment formats specified (required for graphics pipelines)
    #[error("No color attachment formats specified - at least one format is required")]
    NoColorAttachmentFormats,
}

/// Newtype for type-safe shader IDs
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ShaderId(pub(crate) usize);

/// Newtype for type-safe pipeline IDs
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct PipelineId(pub(crate) usize);