use crate::{Heading, NodeId};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
mod blocks;
mod diagnostic;
mod inline;
mod source;
pub use blocks::{
Block, DefinitionItem, DefinitionLayout, LayoutHint, ListItem, ListItemLayout, ListKind,
TableAlignment, TableCell, TableRow,
};
pub use diagnostic::{Diagnostic, DiagnosticImpact, DiagnosticLevel, semantics_complete};
pub use inline::{Inline, LinkTarget};
pub use source::{DocumentSource, SourceFormat, SourceSpan, TextRange, TextSize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct Document {
#[serde(skip_serializing_if = "Option::is_none")]
pub parser: Option<ParserInfo>,
pub source: DocumentSource,
pub meta: DocumentMeta,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub heading: Option<Heading>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub fragment_aliases: Vec<crate::FragmentAlias>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub diagnostics: Vec<Diagnostic>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub blocks: Vec<Block>,
pub sections: Vec<Section>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ParserInfo {
pub name: String,
pub version: String,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct DocumentMeta {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manual_section: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub volume: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub os: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub arch: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub names: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub alias_target: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct Section {
pub id: NodeId,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub fragment_aliases: Vec<crate::FragmentAlias>,
pub heading: Heading,
#[serde(default, skip_serializing_if = "is_zero_u16")]
pub spacing_before_lines: u16,
pub blocks: Vec<Block>,
pub children: Vec<Section>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<SourceSpan>,
}
#[allow(clippy::trivially_copy_pass_by_ref)]
const fn is_zero_u16(value: &u16) -> bool {
*value == 0
}