use bevy_ecs::world::World;
use bevy_mesh::{MeshVertexBufferLayoutRef, MissingVertexAttributeError};
use bevy_platform::sync::Arc;
use core::any::Any;
use thiserror::Error;
use crate::{
descriptor::{CachedRenderPipelineId, RenderPipelineDescriptor},
key::ErasedMaterialPipelineKey,
MaterialProperties,
};
pub type BaseSpecializeFn = fn(
&mut World,
ErasedMaterialPipelineKey,
&MeshVertexBufferLayoutRef,
&Arc<MaterialProperties>,
) -> Result<CachedRenderPipelineId, SpecializedMeshPipelineError>;
pub type PrepassSpecializeFn = fn(
&mut World,
ErasedMaterialPipelineKey,
&MeshVertexBufferLayoutRef,
&Arc<MaterialProperties>,
) -> Result<CachedRenderPipelineId, SpecializedMeshPipelineError>;
pub type UserSpecializeFn = fn(
&dyn Any,
&mut RenderPipelineDescriptor,
&MeshVertexBufferLayoutRef,
ErasedMaterialPipelineKey,
) -> Result<(), SpecializedMeshPipelineError>;
#[derive(Error, Debug)]
pub enum SpecializedMeshPipelineError {
#[error(transparent)]
MissingVertexAttribute(#[from] MissingVertexAttributeError),
}