resume_generator/
language.rs1crate::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}