use crate::Source;
#[derive(Debug)]
pub enum SourceError<'a> {
TemplateWgsl {
uninstantiated_source: &'a Source,
},
TemplateNotFound {
template_name: String,
mangled_type_args: Vec<String>,
available_templates: Vec<String>,
},
AmbiguousTemplate {
template_name: String,
mangled_type_args: Vec<String>,
matching_source_names: Vec<String>,
available_templates: Vec<String>,
},
}
impl<'a> std::fmt::Display for SourceError<'a> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
SourceError::TemplateWgsl {
uninstantiated_source,
} => {
write!(
f,
"source '{}' is a template (has module-level type parameters {:?}); call the \
macro-emitted `instantiate::<…>()` (types in `module_type_params` order) \
then `.wgsl_source()` to render concrete WGSL",
uninstantiated_source.name, uninstantiated_source.module_type_params,
)
}
SourceError::TemplateNotFound {
template_name,
mangled_type_args,
available_templates,
} => {
write!(
f,
"unable to resolve template '{template_name}' for type args \
{mangled_type_args:?}; available templates: {available_templates:?}",
)
}
SourceError::AmbiguousTemplate {
template_name,
mangled_type_args,
matching_source_names,
available_templates,
} => {
write!(
f,
"ambiguous template instantiation '{template_name}' for type args \
{mangled_type_args:?}; matching sources: {matching_source_names:?}; \
available templates: {available_templates:?}",
)
}
}
}
}
impl<'a> std::error::Error for SourceError<'a> {}