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 #[serde(skip_serializing_if = "Option::is_none")]
109 pub org_abbreviation_state: Option<IntegralNameState>,
110}
111
112impl From<CitationOccurrenceItem> for citum_schema::data::citation::CitationItem {
113 fn from(item: CitationOccurrenceItem) -> Self {
114 Self {
115 id: item.id,
116 locator: item.locator,
117 prefix: item.prefix,
118 suffix: item.suffix,
119 integral_name_state: item.integral_name_state,
120 org_abbreviation_state: item.org_abbreviation_state,
121 }
122 }
123}
124
125#[derive(Debug, Clone, Serialize, Deserialize)]
129pub struct CitationOccurrence {
130 pub id: String,
132 pub items: Vec<CitationOccurrenceItem>,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub mode: Option<citum_schema::data::citation::CitationMode>,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub note_number: Option<u32>,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub suppress_author: Option<bool>,
143 #[serde(skip_serializing_if = "Option::is_none")]
145 pub grouped: Option<bool>,
146 #[serde(skip_serializing_if = "Option::is_none")]
148 pub prefix: Option<String>,
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub suffix: Option<String>,
152}
153
154impl From<CitationOccurrence> for citum_schema::data::citation::Citation {
155 fn from(occ: CitationOccurrence) -> Self {
156 Self {
157 id: Some(occ.id),
158 items: occ.items.into_iter().map(|item| item.into()).collect(),
159 mode: occ.mode.unwrap_or_default(),
160 note_number: occ.note_number,
161 suppress_author: occ.suppress_author.unwrap_or(false),
162 grouped: occ.grouped.unwrap_or(false),
163 prefix: occ.prefix,
164 suffix: occ.suffix,
165 position: None, }
167 }
168}
169
170#[derive(Debug, Clone, Default, Serialize, Deserialize)]
174#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
175#[serde(default)]
176pub struct DocumentOptions {
177 #[serde(skip_serializing_if = "Option::is_none")]
179 pub bibliography_groups: Option<Vec<citum_schema::grouping::BibliographyGroup>>,
180 #[serde(skip_serializing_if = "Option::is_none")]
182 pub sort_partitioning: Option<citum_schema::options::BibliographySortPartitioning>,
183 #[serde(skip_serializing_if = "Option::is_none")]
185 pub integral_name_memory: Option<crate::processor::document::DocumentIntegralNameOverride>,
186 #[serde(skip_serializing_if = "Option::is_none")]
188 pub show_semantics: Option<bool>,
189 #[serde(skip_serializing_if = "Option::is_none")]
191 pub inject_ast_indices: Option<bool>,
192 #[serde(skip_serializing_if = "Option::is_none")]
194 pub annotations: Option<HashMap<String, String>>,
195 #[serde(skip_serializing_if = "Option::is_none")]
197 pub annotation_format: Option<AnnotationFormat>,
198 #[serde(alias = "abbreviation-map", skip_serializing_if = "Option::is_none")]
200 pub abbreviation_map: Option<AbbreviationMap>,
201}
202
203#[derive(Debug, Clone, Serialize, Deserialize)]
205pub struct FormattedCitation {
206 pub id: String,
208 pub text: String,
210 pub ref_ids: Vec<String>,
212}
213
214#[derive(Debug, Clone, Default, Serialize, Deserialize)]
216pub struct EntryMetadata {
217 pub author: String,
219 pub year: String,
221 pub title: String,
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize)]
227pub struct BibliographyEntry {
228 pub id: String,
230 pub text: String,
232 pub metadata: EntryMetadata,
234}
235
236#[derive(Debug, Clone, Serialize, Deserialize)]
238pub struct FormattedBibliography {
239 pub format: OutputFormatKind,
241 pub content: String,
243 pub entries: Vec<BibliographyEntry>,
245}