resume-generator 0.1.0

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

#[derive(Debug,Clone)]
pub struct ResumeSkills(Vec<ResumeSkill>);

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

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

impl LatexSectionItem for ResumeSkills {
    fn render_latex_snippet(&self) -> String {
        let mut result = String::new();
        if !self.0.is_empty() {
            result.push_str(r#"\section*{Skills}\begin{itemize}[leftmargin=*, label=-]"#);
            for skill in &self.0 {
                result.push_str(&format!("    \\item {}\n", skill.name()));
            }
            result.push_str(r#"\end{itemize}\vspace{2pt}"#);
        }
        result
    }
}


#[derive(Debug,Clone)]
pub struct ResumeSkill {
    name: String,
}

impl ResumeSkill {
    pub fn builder() -> ResumeSkillBuilder {
        ResumeSkillBuilder::default()
    }

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

#[derive(Default)]
pub struct ResumeSkillBuilder {
    name: Option<String>,
}

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

    pub fn build(self) -> ResumeSkill {
        ResumeSkill {
            name: self.name.expect("Name is required"),
        }
    }
}

#[macro_export]
macro_rules! skill {
    ($name:expr) => {
        ResumeSkill::builder().name($name.to_string()).build()
    };
}