use malloc_size_of_derive::MallocSizeOf;
use serde::{Deserialize, Serialize};
use crate::types::{Lang, SourceNodeId, SourceRange};
pub trait SemanticQuery {
type NodeId: Copy + Eq + std::hash::Hash;
fn title(&self) -> Option<&str>;
fn language(&self) -> Option<&Lang>;
fn headings<'a>(&'a self) -> Box<dyn Iterator<Item = HeadingInfo> + 'a>;
fn links<'a>(&'a self) -> Box<dyn Iterator<Item = LinkInfo> + 'a>;
fn anchors<'a>(&'a self) -> Box<dyn Iterator<Item = AnchorInfo> + 'a>;
fn nodes_by_role<'a>(
&'a self,
role: SemanticRole,
) -> Box<dyn Iterator<Item = Self::NodeId> + 'a>;
fn text_range(&self, node: Self::NodeId) -> Option<&str>;
fn source_range(&self, node: Self::NodeId) -> Option<SourceRange>;
}
#[derive(Clone, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
pub struct HeadingInfo {
pub source_node: SourceNodeId,
pub level: u8,
pub text: String,
}
#[derive(Clone, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
pub struct LinkInfo {
pub source_node: SourceNodeId,
pub href: String,
pub text: String,
}
#[derive(Clone, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
pub struct AnchorInfo {
pub source_node: SourceNodeId,
pub name: String,
}
#[derive(
Clone, Copy, Debug, Default, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize,
)]
pub enum SemanticRole {
Main,
Navigation,
Article,
Section,
Aside,
Header,
Footer,
Heading,
Paragraph,
List,
ListItem,
Quote,
Code,
Form,
#[default]
Generic,
}