use serde::{Deserialize, Serialize};
use crate::fingerprint::BlockId;
use crate::range::ByteRange;
use crate::trivia::SourceTrivia;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum BlockKind {
Heading,
Paragraph,
BulletList,
OrderedList,
TaskList,
Blockquote,
FencedCode,
HorizontalRule,
HtmlBlock,
FrontMatter,
SimpleTable,
ComplexTable,
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum EditablePolicy {
FormEditable,
RawIslandOnly,
DeleteOnly,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ListItemNode {
pub ordinal: u32,
pub source_range: ByteRange,
pub content_range: ByteRange,
pub task_checked: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct HeadingNode {
pub level: u8,
pub text: String,
pub source_range: ByteRange,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BlockNode {
pub block_id: BlockId,
pub kind: BlockKind,
pub source_range: ByteRange,
pub content_range: Option<ByteRange>,
pub trivia: SourceTrivia,
pub editable_policy: EditablePolicy,
pub heading_level: Option<u8>,
pub items: Vec<ListItemNode>,
pub code_language: Option<String>,
}
impl BlockNode {
pub fn is_form_editable(&self) -> bool {
matches!(
self.editable_policy,
EditablePolicy::FormEditable | EditablePolicy::DeleteOnly
)
}
}