resume-generator 0.1.0

does what it says. quick way to generate a latex resume
Documentation
crate::ix!();

#[derive(Debug,Clone)]
pub struct ResumeCertifications(Vec<ResumeCertification>);

impl From<Vec<ResumeCertification>> for ResumeCertifications {
    fn from(x: Vec<ResumeCertification>) -> Self {
        Self(x)
    }
}

impl ResumeCertifications {
    delegate!{
        to self.0 {
            pub fn is_empty(&self) -> bool;
            pub fn len(&self) -> usize;
        }
    }
}

impl LatexSectionItem for ResumeCertifications {

    fn render_latex_snippet(&self) -> String {

        let mut result = String::new();

        if !self.0.is_empty() {

            result.push_str(r#"\section*{Certifications}\begin{itemize}[leftmargin=*, label=-]"#);

            for cert in &self.0 {
                result.push_str(&cert.render_latex_snippet());
            }

            result.push_str(r#"\end{itemize}\vspace{2pt}"#);
        }

        result
    }
}

#[derive(Debug,Clone)]
pub struct ResumeCertification {
    name:                 String,
    issuing_organization: String,
    date:                 NaiveDate,
}

impl LatexSectionItem for ResumeCertification {
    fn render_latex_snippet(&self) -> String {
        format!(r#"    \item {}, {} \hfill \textit{{{}}} \\"#, self.name, self.issuing_organization, self.date)
    }
}

impl ResumeCertification {

    pub fn builder() -> ResumeCertificationBuilder {
        ResumeCertificationBuilder::default()
    }

    pub fn new(name: String, issuing_organization: String, date: NaiveDate) -> Self {
        Self { name, issuing_organization, date }
    }

    pub fn name(&self) -> &str {
        &self.name
    }

    pub fn issuing_organization(&self) -> &str {
        &self.issuing_organization
    }

    pub fn date(&self) -> NaiveDate {
        self.date
    }
}

#[derive(Default)]
pub struct ResumeCertificationBuilder {
    name:                 Option<String>,
    issuing_organization: Option<String>,
    date:                 Option<NaiveDate>,
}

impl ResumeCertificationBuilder {

    pub fn name(mut self, name: String) -> Self {
        self.name = Some(name);
        self
    }

    pub fn issuing_organization(mut self, issuing_organization: String) -> Self {
        self.issuing_organization = Some(issuing_organization);
        self
    }

    pub fn date(mut self, date: NaiveDate) -> Self {
        self.date = Some(date);
        self
    }

    pub fn build(self) -> ResumeCertification {
        ResumeCertification {
            name: self.name.expect("Name is required"),
            issuing_organization: self.issuing_organization.expect("Issuing organization is required"),
            date: self.date.expect("Date is required"),
        }
    }
}