scitadel_export/
csv_export.rs1use scitadel_core::models::Paper;
2
3pub fn export_csv(papers: &[Paper]) -> String {
5 let mut wtr = csv::Writer::from_writer(Vec::new());
6
7 wtr.write_record([
8 "id",
9 "title",
10 "authors",
11 "year",
12 "journal",
13 "doi",
14 "arxiv_id",
15 "pubmed_id",
16 "inspire_id",
17 "openalex_id",
18 "abstract",
19 "url",
20 ])
21 .ok();
22
23 for p in papers {
24 wtr.write_record([
25 p.id.as_str(),
26 &p.title,
27 &p.authors.join("; "),
28 &p.year.map(|y| y.to_string()).unwrap_or_default(),
29 p.journal.as_deref().unwrap_or(""),
30 p.doi.as_deref().unwrap_or(""),
31 p.arxiv_id.as_deref().unwrap_or(""),
32 p.pubmed_id.as_deref().unwrap_or(""),
33 p.inspire_id.as_deref().unwrap_or(""),
34 p.openalex_id.as_deref().unwrap_or(""),
35 &p.r#abstract,
36 p.url.as_deref().unwrap_or(""),
37 ])
38 .ok();
39 }
40
41 String::from_utf8(wtr.into_inner().unwrap_or_default()).unwrap_or_default()
42}
43
44#[cfg(test)]
45mod tests {
46 use super::*;
47
48 #[test]
49 fn test_export_csv_header() {
50 let result = export_csv(&[]);
51 assert!(result.starts_with("id,title,authors,year"));
52 }
53
54 #[test]
55 fn test_export_csv_with_paper() {
56 let mut paper = Paper::new("Test Paper");
57 paper.authors = vec!["Alice Smith".into(), "Bob Jones".into()];
58 paper.year = Some(2024);
59
60 let result = export_csv(&[paper]);
61 assert!(result.contains("Alice Smith; Bob Jones"));
62 assert!(result.contains("2024"));
63 }
64}