use super::{ChunkPlacementError, ChunkPlacementId};
use molgfx_core::{ChunkVisualDescriptor, RelationStyle, ResidencyTicket, VisualCompatibility};
use std::sync::Arc;
#[derive(Clone, Debug, PartialEq)]
pub struct RelationChunkPlacement {
id: ChunkPlacementId,
ticket: ResidencyTicket,
style: RelationStyle,
visual: Option<Arc<ChunkVisualDescriptor>>,
}
impl RelationChunkPlacement {
pub fn new(
id: ChunkPlacementId,
ticket: ResidencyTicket,
style: RelationStyle,
) -> Result<Self, ChunkPlacementError> {
if !style.width_pixels.is_finite()
|| style.width_pixels <= 0.0
|| !style.opacity.is_finite()
|| !(0.0..=1.0).contains(&style.opacity)
|| style
.endpoint_insets_pixels
.iter()
.any(|value| !value.is_finite() || *value < 0.0)
{
return Err(ChunkPlacementError::InvalidRelationStyle);
}
Ok(Self {
id,
ticket,
style,
visual: None,
})
}
pub fn with_visual(
mut self,
visual: Arc<ChunkVisualDescriptor>,
) -> Result<Self, ChunkPlacementError> {
visual
.style()
.program()
.validate_compatibility(VisualCompatibility::RELATIONS)
.map_err(|_| ChunkPlacementError::InvalidRelationVisual)?;
self.visual = Some(visual);
Ok(self)
}
#[must_use]
pub const fn id(&self) -> ChunkPlacementId {
self.id
}
#[must_use]
pub const fn ticket(&self) -> ResidencyTicket {
self.ticket
}
#[must_use]
pub const fn style(&self) -> RelationStyle {
self.style
}
#[must_use]
pub const fn visual(&self) -> Option<&Arc<ChunkVisualDescriptor>> {
self.visual.as_ref()
}
}