Skip to main content

scitadel_export/
csv_export.rs

1use scitadel_core::models::Paper;
2
3/// Export papers as CSV.
4pub 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}