1use citum_schema::data::citation::{CitationLocator, IntegralNameState};
9use serde::{Deserialize, Serialize};
10use std::collections::HashMap;
11
12pub use citum_schema_data::AbbreviationMap;
13
14#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
16#[serde(rename_all = "lowercase")]
17pub enum WarningLevel {
18 Warning,
20 Error,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct Warning {
27 pub level: WarningLevel,
29 pub code: String,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub citation_id: Option<String>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub ref_id: Option<String>,
37 pub message: String,
39}
40
41#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
43#[serde(rename_all = "lowercase")]
44pub enum OutputFormatKind {
45 #[default]
47 Plain,
48 Html,
50 Djot,
52 Latex,
54 Typst,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
60pub struct AnnotationStyle {
61 #[serde(default)]
63 pub format: AnnotationFormat,
64}
65
66impl Default for AnnotationStyle {
67 fn default() -> Self {
68 Self {
69 format: AnnotationFormat::Djot,
70 }
71 }
72}
73
74#[derive(Debug, Clone, Default, Serialize, Deserialize)]
76#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
77#[serde(rename_all = "snake_case")]
78pub enum AnnotationFormat {
79 #[default]
81 Djot,
82 Plain,
84 Org,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
92pub struct CitationOccurrenceItem {
93 pub id: String,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub locator: Option<CitationLocator>,
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub prefix: Option<String>,
101 #[serde(skip_serializing_if = "Option::is_none")]
103 pub suffix: Option<String>,
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub integral_name_state: Option<IntegralNameState>,
107}
108
109impl From<CitationOccurrenceItem> for citum_schema::data::citation::CitationItem {
110 fn from(item: CitationOccurrenceItem) -> Self {
111 Self {
112 id: item.id,
113 locator: item.locator,
114 prefix: item.prefix,
115 suffix: item.suffix,
116 integral_name_state: item.integral_name_state,
117 }
118 }
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize)]
125pub struct CitationOccurrence {
126 pub id: String,
128 pub items: Vec<CitationOccurrenceItem>,
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub mode: Option<citum_schema::data::citation::CitationMode>,
133 #[serde(skip_serializing_if = "Option::is_none")]
135 pub note_number: Option<u32>,
136 #[serde(skip_serializing_if = "Option::is_none")]
138 pub suppress_author: Option<bool>,
139 #[serde(skip_serializing_if = "Option::is_none")]
141 pub grouped: Option<bool>,
142 #[serde(skip_serializing_if = "Option::is_none")]
144 pub prefix: Option<String>,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub suffix: Option<String>,
148}
149
150impl From<CitationOccurrence> for citum_schema::data::citation::Citation {
151 fn from(occ: CitationOccurrence) -> Self {
152 Self {
153 id: Some(occ.id),
154 items: occ.items.into_iter().map(|item| item.into()).collect(),
155 mode: occ.mode.unwrap_or_default(),
156 note_number: occ.note_number,
157 suppress_author: occ.suppress_author.unwrap_or(false),
158 grouped: occ.grouped.unwrap_or(false),
159 prefix: occ.prefix,
160 suffix: occ.suffix,
161 position: None, }
163 }
164}
165
166#[derive(Debug, Clone, Default, Serialize, Deserialize)]
170#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
171#[serde(default)]
172pub struct DocumentOptions {
173 #[serde(skip_serializing_if = "Option::is_none")]
175 pub bibliography_groups: Option<Vec<citum_schema::grouping::BibliographyGroup>>,
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub sort_partitioning: Option<citum_schema::options::BibliographySortPartitioning>,
179 #[serde(skip_serializing_if = "Option::is_none")]
181 pub integral_name_memory: Option<crate::processor::document::DocumentIntegralNameOverride>,
182 #[serde(skip_serializing_if = "Option::is_none")]
184 pub show_semantics: Option<bool>,
185 #[serde(skip_serializing_if = "Option::is_none")]
187 pub inject_ast_indices: Option<bool>,
188 #[serde(skip_serializing_if = "Option::is_none")]
190 pub annotations: Option<HashMap<String, String>>,
191 #[serde(skip_serializing_if = "Option::is_none")]
193 pub annotation_format: Option<AnnotationFormat>,
194 #[serde(alias = "abbreviation-map", skip_serializing_if = "Option::is_none")]
196 pub abbreviation_map: Option<AbbreviationMap>,
197}
198
199#[derive(Debug, Clone, Serialize, Deserialize)]
201pub struct FormattedCitation {
202 pub id: String,
204 pub text: String,
206 pub ref_ids: Vec<String>,
208}
209
210#[derive(Debug, Clone, Default, Serialize, Deserialize)]
212pub struct EntryMetadata {
213 pub author: String,
215 pub year: String,
217 pub title: String,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize)]
223pub struct BibliographyEntry {
224 pub id: String,
226 pub text: String,
228 pub metadata: EntryMetadata,
230}
231
232#[derive(Debug, Clone, Serialize, Deserialize)]
234pub struct FormattedBibliography {
235 pub format: OutputFormatKind,
237 pub content: String,
239 pub entries: Vec<BibliographyEntry>,
241}