use std::env;
use crate::error::PlatformError;
pub const RENDERER_ENVIRONMENT: &str = "SMUDGE_RENDERER";
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum RendererChoice {
Cpu,
Gpu,
Auto,
}
impl Default for RendererChoice {
fn default() -> RendererChoice {
if cfg!(feature = "gpu") {
RendererChoice::Auto
} else {
RendererChoice::Cpu
}
}
}
impl RendererChoice {
pub(crate) fn with_env_override(self) -> Result<RendererChoice, PlatformError> {
let value = env::var(RENDERER_ENVIRONMENT).ok();
match env_choice(value.as_deref()) {
Ok(Some(overridden)) => Ok(overridden),
Ok(None) => Ok(self),
Err(value) => Err(PlatformError::Renderer(format!(
"{RENDERER_ENVIRONMENT} is set to {value:?}; expected cpu, gpu or auto"
))),
}
}
}
fn env_choice(value: Option<&str>) -> Result<Option<RendererChoice>, String> {
match value {
None | Some("") => Ok(None),
Some("cpu") => Ok(Some(RendererChoice::Cpu)),
Some("gpu") => Ok(Some(RendererChoice::Gpu)),
Some("auto") => Ok(Some(RendererChoice::Auto)),
Some(other) => Err(String::from(other)),
}
}
#[cfg(test)]
#[path = "renderer_tests.rs"]
mod tests;