use crate::{ResidencyTicket, VisualAttributeRef, VisualColumnKey, VisualError, VisualStyle};
use std::sync::Arc;
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct ChunkVisualBinding {
key: VisualColumnKey,
ticket: ResidencyTicket,
}
impl ChunkVisualBinding {
#[must_use]
pub const fn new(key: VisualColumnKey, ticket: ResidencyTicket) -> Self {
Self { key, ticket }
}
#[must_use]
pub const fn key(self) -> VisualColumnKey {
self.key
}
#[must_use]
pub const fn ticket(self) -> ResidencyTicket {
self.ticket
}
}
#[derive(Clone, PartialEq, Debug)]
pub struct ChunkVisualDescriptor {
style: VisualStyle,
bindings: Arc<[ChunkVisualBinding]>,
order: i32,
}
impl ChunkVisualDescriptor {
pub fn new(
style: VisualStyle,
bindings: Arc<[ChunkVisualBinding]>,
) -> Result<Self, VisualError> {
let attributes = style.program().attributes();
if attributes.len() != bindings.len()
|| bindings.iter().enumerate().any(|(index, binding)| {
attributes
.get(index)
.and_then(|reference| reference.column())
!= Some(binding.key)
})
|| attributes
.iter()
.any(|reference| !matches!(reference, VisualAttributeRef::Column { .. }))
{
return Err(VisualError::InvalidColumnBinding);
}
Ok(Self {
style,
bindings,
order: 0,
})
}
#[must_use]
pub const fn with_order(mut self, order: i32) -> Self {
self.order = order;
self
}
#[must_use]
pub const fn style(&self) -> &VisualStyle {
&self.style
}
#[must_use]
pub const fn bindings(&self) -> &Arc<[ChunkVisualBinding]> {
&self.bindings
}
#[must_use]
pub const fn order(&self) -> i32 {
self.order
}
}