use std::sync::Arc;
use crate::diff::LayoutDiff;
use crate::overlay::{AnchorFailure, OverlayId};
use crate::resolver::ResolvedLayout;
use crate::runtime::{Frame, LayoutRuntime};
pub struct AdapterFrame<'a> {
kind: AdapterFrameKind<'a>,
}
enum AdapterFrameKind<'a> {
Runtime { frame: Frame, rt: &'a LayoutRuntime },
Stateless { resolved: ResolvedLayout },
}
impl<'a> AdapterFrame<'a> {
pub fn from_runtime(frame: Frame, rt: &'a LayoutRuntime) -> Self {
Self {
kind: AdapterFrameKind::Runtime { frame, rt },
}
}
pub fn from_stateless(resolved: ResolvedLayout) -> Self {
Self {
kind: AdapterFrameKind::Stateless { resolved },
}
}
pub fn resolved(&self) -> &ResolvedLayout {
match &self.kind {
AdapterFrameKind::Runtime { frame, .. } => frame.layout(),
AdapterFrameKind::Stateless { resolved } => resolved,
}
}
pub fn diff(&self) -> Option<LayoutDiff<'_>> {
match &self.kind {
AdapterFrameKind::Runtime { rt, .. } => Some(rt.last_diff()),
AdapterFrameKind::Stateless { .. } => None,
}
}
pub fn inner(&self) -> Option<&Frame> {
match &self.kind {
AdapterFrameKind::Runtime { frame, .. } => Some(frame),
AdapterFrameKind::Stateless { .. } => None,
}
}
pub fn overlay_failures(&self) -> &[(OverlayId, Arc<str>, AnchorFailure)] {
self.resolved().overlay_failures()
}
}