pubmed 0.2.1

A wrapper around the PubMed API
Documentation
use serde::{Deserialize, Serialize};

use crate::helpers::missing_tag_warning;
use crate::types::journal_issue::JournalIssue;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Journal {
    pub issn: Option<String>,
    pub issn_type: Option<String>,
    pub journal_issue: Option<JournalIssue>,
    pub title: Option<String>,
    pub iso_abbreviation: Option<String>,
}

impl Journal {
    #[must_use] 
    pub fn new() -> Self {
        Self::default()
    }

    #[must_use] 
    pub fn new_from_xml(node: &roxmltree::Node) -> Self {
        let mut ret = Self::default();
        for n in node.children().filter(roxmltree::Node::is_element) {
            match n.tag_name().name() {
                "ISSN" => {
                    ret.issn = n.text().map(std::string::ToString::to_string);
                    ret.issn_type = n.attribute("IssnType").map(std::string::ToString::to_string);
                }
                "JournalIssue" => ret.journal_issue = Some(JournalIssue::new_from_xml(&n)),
                "Title" => ret.title = n.text().map(std::string::ToString::to_string),
                "ISOAbbreviation" => ret.iso_abbreviation = n.text().map(std::string::ToString::to_string),
                x => missing_tag_warning(&format!("Not covered in Journal: '{x}'")),
            }
        }
        ret
    }
}