use malloc_size_of_derive::MallocSizeOf;
use serde::{Deserialize, Serialize};
use crate::types::{Point, Rect, SourceNodeId, SourceRange};
pub trait FragmentQuery {
type FragmentId: Copy + Eq + std::hash::Hash;
fn generation_id(&self) -> u64;
fn hit_test(&self, point: Point) -> Option<FragmentHit<Self::FragmentId>>;
fn box_model(&self, source_id: SourceNodeId) -> Option<BoxModel>;
fn fragments_for_anchor<'a>(
&'a self,
anchor: &str,
) -> Box<dyn Iterator<Item = Self::FragmentId> + 'a>;
fn text_range_for_fragment(&self, fragment: Self::FragmentId) -> Option<SourceRange>;
fn rects_for_selection(&self, range: SourceRange) -> Vec<Rect>;
}
#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
pub struct FragmentHit<FragmentId: Copy> {
pub fragment: FragmentId,
pub source_node: SourceNodeId,
pub local_point: Point,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, MallocSizeOf, PartialEq, Serialize)]
pub struct BoxModel {
pub content: Rect,
pub padding: Rect,
pub border: Rect,
pub margin: Rect,
}