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#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
44#[serde(rename_all = "lowercase")]
45pub enum OutputFormatKind {
46 #[default]
48 Plain,
49 Html,
51 Djot,
53 Latex,
55 Typst,
57 Markdown,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct AnnotationStyle {
64 #[serde(default)]
66 pub format: AnnotationFormat,
67}
68
69impl Default for AnnotationStyle {
70 fn default() -> Self {
71 Self {
72 format: AnnotationFormat::Djot,
73 }
74 }
75}
76
77#[derive(Debug, Clone, Default, Serialize, Deserialize)]
79#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
80#[serde(rename_all = "snake_case")]
81pub enum AnnotationFormat {
82 #[default]
84 Djot,
85 Plain,
87 Org,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
95#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
96pub struct CitationOccurrenceItem {
97 pub id: String,
99 #[serde(skip_serializing_if = "Option::is_none")]
101 pub locator: Option<CitationLocator>,
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub prefix: Option<String>,
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub suffix: Option<String>,
108 #[serde(skip_serializing_if = "Option::is_none")]
110 pub integral_name_state: Option<IntegralNameState>,
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub org_abbreviation_state: Option<IntegralNameState>,
114}
115
116impl From<CitationOccurrenceItem> for citum_schema::data::citation::CitationItem {
117 fn from(item: CitationOccurrenceItem) -> Self {
118 Self {
119 id: item.id,
120 locator: item.locator,
121 prefix: item.prefix,
122 suffix: item.suffix,
123 integral_name_state: item.integral_name_state,
124 org_abbreviation_state: item.org_abbreviation_state,
125 }
126 }
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
133#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
134pub struct CitationOccurrence {
135 pub id: String,
137 pub items: Vec<CitationOccurrenceItem>,
139 #[serde(skip_serializing_if = "Option::is_none")]
141 pub mode: Option<citum_schema::data::citation::CitationMode>,
142 #[serde(skip_serializing_if = "Option::is_none")]
144 pub note_number: Option<u32>,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub suppress_author: Option<bool>,
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub grouped: Option<bool>,
151 #[serde(skip_serializing_if = "Option::is_none")]
153 pub prefix: Option<String>,
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub suffix: Option<String>,
157 #[serde(skip_serializing_if = "Option::is_none")]
159 pub sentence_start: Option<bool>,
160}
161
162impl From<CitationOccurrence> for citum_schema::data::citation::Citation {
163 fn from(occ: CitationOccurrence) -> Self {
164 Self {
165 id: Some(occ.id),
166 items: occ.items.into_iter().map(|item| item.into()).collect(),
167 mode: occ.mode.unwrap_or_default(),
168 note_number: occ.note_number,
169 suppress_author: occ.suppress_author.unwrap_or(false),
170 grouped: occ.grouped.unwrap_or(false),
171 sentence_start: occ.sentence_start.unwrap_or(false),
172 prefix: occ.prefix,
173 suffix: occ.suffix,
174 position: None, }
176 }
177}
178
179#[derive(Debug, Clone, Default, Serialize, Deserialize)]
183#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
184#[serde(default)]
185pub struct DocumentOptions {
186 #[serde(skip_serializing_if = "Option::is_none")]
188 pub bibliography_groups: Option<Vec<citum_schema::grouping::BibliographyGroup>>,
189 #[serde(skip_serializing_if = "Option::is_none")]
191 pub sort_partitioning: Option<citum_schema::options::BibliographySortPartitioning>,
192 #[serde(skip_serializing_if = "Option::is_none")]
194 pub integral_name_memory: Option<crate::processor::document::DocumentIntegralNameOverride>,
195 #[serde(skip_serializing_if = "Option::is_none")]
197 pub show_semantics: Option<bool>,
198 #[serde(skip_serializing_if = "Option::is_none")]
200 pub inject_ast_indices: Option<bool>,
201 #[serde(skip_serializing_if = "Option::is_none")]
203 pub annotations: Option<HashMap<String, String>>,
204 #[serde(skip_serializing_if = "Option::is_none")]
206 pub annotation_format: Option<AnnotationFormat>,
207 #[serde(alias = "abbreviation-map", skip_serializing_if = "Option::is_none")]
209 pub abbreviation_map: Option<AbbreviationMap>,
210}
211
212#[derive(Debug, Clone, Serialize, Deserialize)]
214pub struct FormattedCitation {
215 pub id: String,
217 pub text: String,
219 pub ref_ids: Vec<String>,
221}
222
223#[derive(Debug, Clone, Default, Serialize, Deserialize)]
225#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
226pub struct EntryMetadata {
227 pub author: String,
229 pub year: String,
231 pub title: String,
233}
234
235#[derive(Debug, Clone, Serialize, Deserialize)]
237#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
238pub struct BibliographyEntry {
239 pub id: String,
241 pub text: String,
243 pub metadata: EntryMetadata,
245}
246
247#[derive(Debug, Clone, Serialize, Deserialize)]
249#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
250pub struct FormattedBibliography {
251 pub format: OutputFormatKind,
253 pub content: String,
255 pub entries: Vec<BibliographyEntry>,
257}
258
259#[derive(Debug, Clone, Serialize, Deserialize)]
261#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
262pub struct BibliographyBlockRequest {
263 pub id: String,
265 pub group: citum_schema::grouping::BibliographyGroup,
267}
268
269#[derive(Debug, Clone, Serialize, Deserialize)]
271#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
272pub struct FormattedBibliographyBlock {
273 pub id: String,
275 #[serde(skip_serializing_if = "Option::is_none")]
277 pub heading: Option<String>,
278 pub content: String,
280 pub entries: Vec<BibliographyEntry>,
282}