mirror of
https://github.com/gfx-rs/wgpu.git
synced 2025-12-08 21:26:17 +00:00
This allows `wgpu-hal` to be used in `no_std` environments, except that currently, only the `noop` backend supports `no_std`. In the future, `cfg(all(gles, webgl))` should also be `no_std`, but that requires further work. Co-Authored_by: Kevin Reid <kpreid@switchb.org>
65 lines
1.7 KiB
Rust
65 lines
1.7 KiB
Rust
use alloc::{boxed::Box, string::String, sync::Arc, vec::Vec};
|
|
use core::{error::Error, fmt};
|
|
|
|
use thiserror::Error;
|
|
|
|
#[cfg(send_sync)]
|
|
pub type ContextErrorSource = Box<dyn Error + Send + Sync + 'static>;
|
|
#[cfg(not(send_sync))]
|
|
pub type ContextErrorSource = Box<dyn Error + 'static>;
|
|
|
|
#[derive(Debug, Error)]
|
|
#[error(
|
|
"In {fn_ident}{}{}{}",
|
|
if self.label.is_empty() { "" } else { ", label = '" },
|
|
self.label,
|
|
if self.label.is_empty() { "" } else { "'" }
|
|
)]
|
|
pub struct ContextError {
|
|
pub fn_ident: &'static str,
|
|
#[source]
|
|
pub source: ContextErrorSource,
|
|
pub label: String,
|
|
}
|
|
|
|
/// Don't use this error type with thiserror's #[error(transparent)]
|
|
#[derive(Clone)]
|
|
pub struct MultiError {
|
|
inner: Vec<Arc<dyn Error + Send + Sync + 'static>>,
|
|
}
|
|
|
|
impl MultiError {
|
|
pub fn new<T: Error + Send + Sync + 'static>(
|
|
iter: impl ExactSizeIterator<Item = T>,
|
|
) -> Option<Self> {
|
|
if iter.len() == 0 {
|
|
return None;
|
|
}
|
|
Some(Self {
|
|
inner: iter.map(Box::from).map(Arc::from).collect(),
|
|
})
|
|
}
|
|
|
|
pub fn errors(&self) -> Box<dyn Iterator<Item = &(dyn Error + Send + Sync + 'static)> + '_> {
|
|
Box::new(self.inner.iter().map(|e| e.as_ref()))
|
|
}
|
|
}
|
|
|
|
impl fmt::Debug for MultiError {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
|
|
fmt::Debug::fmt(&self.inner[0], f)
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for MultiError {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
|
|
fmt::Display::fmt(&self.inner[0], f)
|
|
}
|
|
}
|
|
|
|
impl Error for MultiError {
|
|
fn source(&self) -> Option<&(dyn Error + 'static)> {
|
|
self.inner[0].source()
|
|
}
|
|
}
|