use std::collections::HashMap;
use anyhow::Result;
use crate::{BufferView, Error, ImageView, VirtualResource};
#[derive(Debug, Clone)]
pub enum PhysicalResource {
Image(ImageView),
Buffer(BufferView),
}
#[derive(Debug, Default)]
pub struct PhysicalResourceBindings {
bindings: HashMap<String, PhysicalResource>,
}
impl PhysicalResourceBindings {
pub fn new() -> Self {
Self::default()
}
pub fn bind_image(&mut self, name: impl Into<String>, image: &ImageView) {
self.bindings
.insert(name.into(), PhysicalResource::Image(image.clone()));
}
pub fn bind_buffer(&mut self, name: impl Into<String>, buffer: &BufferView) {
self.bindings
.insert(name.into(), PhysicalResource::Buffer(*buffer));
}
pub fn alias(&mut self, new_name: impl Into<String>, resource: &str) -> Result<()> {
self.bindings.insert(
new_name.into(),
self.bindings
.get(resource)
.ok_or_else(|| Error::NoResourceBound(resource.to_owned()))?
.clone(),
);
Ok(())
}
pub fn resolve(&self, resource: &VirtualResource) -> Option<&PhysicalResource> {
self.bindings.get(resource.name())
}
}