use citum_schema::data::citation::{CitationLocator, IntegralNameState};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
pub use citum_schema_data::AbbreviationMap;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum WarningLevel {
Warning,
Error,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Warning {
pub level: WarningLevel,
pub code: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub citation_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ref_id: Option<String>,
pub message: String,
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum OutputFormatKind {
#[default]
Plain,
Html,
Djot,
Latex,
Typst,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnnotationStyle {
#[serde(default)]
pub format: AnnotationFormat,
}
impl Default for AnnotationStyle {
fn default() -> Self {
Self {
format: AnnotationFormat::Djot,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum AnnotationFormat {
#[default]
Djot,
Plain,
Org,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CitationOccurrenceItem {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub locator: Option<CitationLocator>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prefix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suffix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub integral_name_state: Option<IntegralNameState>,
}
impl From<CitationOccurrenceItem> for citum_schema::data::citation::CitationItem {
fn from(item: CitationOccurrenceItem) -> Self {
Self {
id: item.id,
locator: item.locator,
prefix: item.prefix,
suffix: item.suffix,
integral_name_state: item.integral_name_state,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CitationOccurrence {
pub id: String,
pub items: Vec<CitationOccurrenceItem>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mode: Option<citum_schema::data::citation::CitationMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub note_number: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suppress_author: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub grouped: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prefix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suffix: Option<String>,
}
impl From<CitationOccurrence> for citum_schema::data::citation::Citation {
fn from(occ: CitationOccurrence) -> Self {
Self {
id: Some(occ.id),
items: occ.items.into_iter().map(|item| item.into()).collect(),
mode: occ.mode.unwrap_or_default(),
note_number: occ.note_number,
suppress_author: occ.suppress_author.unwrap_or(false),
grouped: occ.grouped.unwrap_or(false),
prefix: occ.prefix,
suffix: occ.suffix,
position: None, }
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(default)]
pub struct DocumentOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub bibliography_groups: Option<Vec<citum_schema::grouping::BibliographyGroup>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_partitioning: Option<citum_schema::options::BibliographySortPartitioning>,
#[serde(skip_serializing_if = "Option::is_none")]
pub integral_name_memory: Option<crate::processor::document::DocumentIntegralNameOverride>,
#[serde(skip_serializing_if = "Option::is_none")]
pub show_semantics: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inject_ast_indices: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotation_format: Option<AnnotationFormat>,
#[serde(alias = "abbreviation-map", skip_serializing_if = "Option::is_none")]
pub abbreviation_map: Option<AbbreviationMap>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FormattedCitation {
pub id: String,
pub text: String,
pub ref_ids: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct EntryMetadata {
pub author: String,
pub year: String,
pub title: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BibliographyEntry {
pub id: String,
pub text: String,
pub metadata: EntryMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FormattedBibliography {
pub format: OutputFormatKind,
pub content: String,
pub entries: Vec<BibliographyEntry>,
}