resume_generator/
language.rs

1crate::ix!();
2
3#[derive(Debug,Clone)]
4pub struct ResumeLanguages(Vec<Language>);
5
6impl From<Vec<Language>> for ResumeLanguages {
7    fn from(x: Vec<Language>) -> Self {
8        Self(x)
9    }
10}
11
12impl ResumeLanguages {
13    delegate!{
14        to self.0 {
15            pub fn is_empty(&self) -> bool;
16            pub fn len(&self) -> usize;
17        }
18    }
19}
20
21impl LatexSectionItem for ResumeLanguages {
22
23    fn render_latex_snippet(&self) -> String {
24
25        let mut result = String::new();
26
27        if !self.0.is_empty() {
28
29            result.push_str(r#"\section*{Languages}\begin{itemize}[leftmargin=*, label=-]"#);
30
31            for lang in &self.0 {
32                let text = lang.render_latex_snippet();
33                result.push_str(&text);
34            }
35
36            result.push_str(r#"\end{itemize}\vspace{2pt}"#);
37        }
38
39        result
40    }
41}
42
43#[derive(Debug,Clone)]
44pub struct Language {
45    name:        LanguageName,
46    proficiency: ProficiencyLevel,
47}
48
49impl LatexSectionItem for Language {
50    fn render_latex_snippet(&self) -> String {
51        format!("    \\item {} - {}\n", self.name, self.proficiency)
52    }
53}
54
55impl Language {
56    pub fn new(name: LanguageName, proficiency: ProficiencyLevel) -> Self {
57        Self { name, proficiency }
58    }
59
60    pub fn name(&self) -> &LanguageName {
61        &self.name
62    }
63
64    pub fn proficiency(&self) -> &ProficiencyLevel {
65        &self.proficiency
66    }
67}
68
69
70#[derive(Debug,Clone)]
71pub enum LanguageName {
72    English,
73    Spanish,
74    French,
75    German,
76    Chinese,
77    Other(String),
78}
79
80impl fmt::Display for LanguageName {
81    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
82        match self {
83            LanguageName::English => write!(f, "English"),
84            LanguageName::Spanish => write!(f, "Spanish"),
85            LanguageName::French => write!(f, "French"),
86            LanguageName::German => write!(f, "German"),
87            LanguageName::Chinese => write!(f, "Chinese"),
88            LanguageName::Other(name) => write!(f, "{}", name),
89        }
90    }
91}
92
93#[derive(Debug,Clone)]
94pub enum ProficiencyLevel {
95    Native,
96    Fluent,
97    Professional,
98    Intermediate,
99    Basic,
100}
101
102impl fmt::Display for ProficiencyLevel {
103    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
104        match self {
105            ProficiencyLevel::Native => write!(f, "Native"),
106            ProficiencyLevel::Fluent => write!(f, "Fluent"),
107            ProficiencyLevel::Professional => write!(f, "Professional"),
108            ProficiencyLevel::Intermediate => write!(f, "Intermediate"),
109            ProficiencyLevel::Basic => write!(f, "Basic"),
110        }
111    }
112}