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 Markdown,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct AnnotationStyle {
63 #[serde(default)]
65 pub format: AnnotationFormat,
66}
67
68impl Default for AnnotationStyle {
69 fn default() -> Self {
70 Self {
71 format: AnnotationFormat::Djot,
72 }
73 }
74}
75
76#[derive(Debug, Clone, Default, Serialize, Deserialize)]
78#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
79#[serde(rename_all = "snake_case")]
80pub enum AnnotationFormat {
81 #[default]
83 Djot,
84 Plain,
86 Org,
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct CitationOccurrenceItem {
95 pub id: String,
97 #[serde(skip_serializing_if = "Option::is_none")]
99 pub locator: Option<CitationLocator>,
100 #[serde(skip_serializing_if = "Option::is_none")]
102 pub prefix: Option<String>,
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub suffix: Option<String>,
106 #[serde(skip_serializing_if = "Option::is_none")]
108 pub integral_name_state: Option<IntegralNameState>,
109 #[serde(skip_serializing_if = "Option::is_none")]
111 pub org_abbreviation_state: Option<IntegralNameState>,
112}
113
114impl From<CitationOccurrenceItem> for citum_schema::data::citation::CitationItem {
115 fn from(item: CitationOccurrenceItem) -> Self {
116 Self {
117 id: item.id,
118 locator: item.locator,
119 prefix: item.prefix,
120 suffix: item.suffix,
121 integral_name_state: item.integral_name_state,
122 org_abbreviation_state: item.org_abbreviation_state,
123 }
124 }
125}
126
127#[derive(Debug, Clone, Serialize, Deserialize)]
131pub struct CitationOccurrence {
132 pub id: String,
134 pub items: Vec<CitationOccurrenceItem>,
136 #[serde(skip_serializing_if = "Option::is_none")]
138 pub mode: Option<citum_schema::data::citation::CitationMode>,
139 #[serde(skip_serializing_if = "Option::is_none")]
141 pub note_number: Option<u32>,
142 #[serde(skip_serializing_if = "Option::is_none")]
144 pub suppress_author: Option<bool>,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub grouped: Option<bool>,
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub prefix: Option<String>,
151 #[serde(skip_serializing_if = "Option::is_none")]
153 pub suffix: Option<String>,
154}
155
156impl From<CitationOccurrence> for citum_schema::data::citation::Citation {
157 fn from(occ: CitationOccurrence) -> Self {
158 Self {
159 id: Some(occ.id),
160 items: occ.items.into_iter().map(|item| item.into()).collect(),
161 mode: occ.mode.unwrap_or_default(),
162 note_number: occ.note_number,
163 suppress_author: occ.suppress_author.unwrap_or(false),
164 grouped: occ.grouped.unwrap_or(false),
165 prefix: occ.prefix,
166 suffix: occ.suffix,
167 position: None, }
169 }
170}
171
172#[derive(Debug, Clone, Default, Serialize, Deserialize)]
176#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
177#[serde(default)]
178pub struct DocumentOptions {
179 #[serde(skip_serializing_if = "Option::is_none")]
181 pub bibliography_groups: Option<Vec<citum_schema::grouping::BibliographyGroup>>,
182 #[serde(skip_serializing_if = "Option::is_none")]
184 pub sort_partitioning: Option<citum_schema::options::BibliographySortPartitioning>,
185 #[serde(skip_serializing_if = "Option::is_none")]
187 pub integral_name_memory: Option<crate::processor::document::DocumentIntegralNameOverride>,
188 #[serde(skip_serializing_if = "Option::is_none")]
190 pub show_semantics: Option<bool>,
191 #[serde(skip_serializing_if = "Option::is_none")]
193 pub inject_ast_indices: Option<bool>,
194 #[serde(skip_serializing_if = "Option::is_none")]
196 pub annotations: Option<HashMap<String, String>>,
197 #[serde(skip_serializing_if = "Option::is_none")]
199 pub annotation_format: Option<AnnotationFormat>,
200 #[serde(alias = "abbreviation-map", skip_serializing_if = "Option::is_none")]
202 pub abbreviation_map: Option<AbbreviationMap>,
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize)]
207pub struct FormattedCitation {
208 pub id: String,
210 pub text: String,
212 pub ref_ids: Vec<String>,
214}
215
216#[derive(Debug, Clone, Default, Serialize, Deserialize)]
218pub struct EntryMetadata {
219 pub author: String,
221 pub year: String,
223 pub title: String,
225}
226
227#[derive(Debug, Clone, Serialize, Deserialize)]
229pub struct BibliographyEntry {
230 pub id: String,
232 pub text: String,
234 pub metadata: EntryMetadata,
236}
237
238#[derive(Debug, Clone, Serialize, Deserialize)]
240pub struct FormattedBibliography {
241 pub format: OutputFormatKind,
243 pub content: String,
245 pub entries: Vec<BibliographyEntry>,
247}