Skip to content

Commit 0baadf5

Browse files
committed
Improve Language API
Impl standard traits like `FromStr` and `Display` for the struct.
1 parent 258045b commit 0baadf5

File tree

3 files changed

+43
-79
lines changed

3 files changed

+43
-79
lines changed

src/file_parser/codefile.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use eyre::Result;
22

33
use super::language::*;
4-
use std::path::PathBuf;
4+
use std::{path::PathBuf, str::FromStr};
55

66
pub struct CodeFile {
77
pub language: Language,
@@ -63,7 +63,7 @@ impl CodeFile {
6363
fn is_valid_file<'a>(path: &'a std::path::PathBuf) -> Option<(&'a str, Self)> {
6464
let file_name = path.file_name().and_then(|filename| filename.to_str())?;
6565
let extension = path.extension().and_then(|ext| ext.to_str())?;
66-
let language = Language::from_str(extension)?;
66+
let language = Language::from_str(extension).ok()?;
6767

6868
Some((
6969
file_name,

src/file_parser/language.rs

Lines changed: 36 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
#[derive(Default, Clone, Copy)]
1+
use std::{fmt, str::FromStr};
2+
3+
#[derive(Debug, Default, Clone, Copy)]
24
pub enum Language {
35
#[default]
46
Rust,
@@ -20,75 +22,42 @@ pub enum Language {
2022
Elixir,
2123
Dart,
2224
}
23-
impl Language {
24-
pub fn from_str(input: &str) -> Option<Language> {
25-
match input {
26-
"rs" => Some(Language::Rust),
27-
"py" => Some(Language::Python3),
28-
"cpp" => Some(Language::Cpp),
29-
"java" => Some(Language::Java),
30-
"c" => Some(Language::C),
31-
"js" => Some(Language::Javascript),
32-
"go" => Some(Language::Go),
33-
"kt" => Some(Language::Kotlin),
34-
"swift" => Some(Language::Swift),
35-
"ts" => Some(Language::Typescript),
36-
"cs" => Some(Language::Csharp),
37-
"rb" => Some(Language::Ruby),
38-
"scala" => Some(Language::Scala),
39-
"php" => Some(Language::PHP),
40-
"rkt" => Some(Language::Racket),
41-
"erl" => Some(Language::Erlang),
42-
"ex" => Some(Language::Elixir),
43-
"dart" => Some(Language::Dart),
44-
_ => None,
45-
}
46-
}
47-
pub fn to_str(&self) -> &str {
48-
match self {
49-
Language::Rust => "rust",
50-
Language::Python3 => "python3",
51-
Language::Cpp => "cpp",
52-
Language::Java => "java",
53-
Language::C => "c",
54-
Language::Javascript => "javascript",
55-
Language::Go => "golang",
56-
Language::Kotlin => "kotlin",
57-
Language::Swift => "swift",
58-
Language::Typescript => "typescript",
59-
Language::Csharp => "csharp",
60-
Language::Ruby => "ruby",
61-
Language::Scala => "scala",
62-
Language::PHP => "php",
63-
Language::Racket => "racket",
64-
Language::Erlang => "erlang",
65-
Language::Elixir => "elixir",
66-
Language::Dart => "dart",
67-
}
25+
26+
impl fmt::Display for Language {
27+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28+
f.write_str(&format!("{:?}", self).to_lowercase())
6829
}
69-
pub(crate) fn from_slug(input: &str) -> Option<Language> {
70-
match input.to_lowercase().as_str() {
71-
"rust" => Some(Language::Rust),
72-
"python3" => Some(Language::Python3),
73-
"cpp" => Some(Language::Cpp),
74-
"java" => Some(Language::Java),
75-
"c" => Some(Language::C),
76-
"javascript" => Some(Language::Javascript),
77-
"golang" => Some(Language::Go),
78-
"kotlin" => Some(Language::Kotlin),
79-
"swift" => Some(Language::Swift),
80-
"typescript" => Some(Language::Typescript),
81-
"csharp" => Some(Language::Csharp),
82-
"ruby" => Some(Language::Ruby),
83-
"scala" => Some(Language::Scala),
84-
"php" => Some(Language::PHP),
85-
"racket" => Some(Language::Racket),
86-
"erlang" => Some(Language::Erlang),
87-
"elixir" => Some(Language::Elixir),
88-
"dart" => Some(Language::Dart),
89-
_ => None,
30+
}
31+
32+
impl FromStr for Language {
33+
type Err = eyre::ErrReport;
34+
35+
fn from_str(s: &str) -> Result<Self, Self::Err> {
36+
match s.to_lowercase().as_ref() {
37+
"rs" | "rust" => Ok(Language::Rust),
38+
"py" | "python" | "python3" => Ok(Language::Python3),
39+
"cpp" => Ok(Language::Cpp),
40+
"java" => Ok(Language::Java),
41+
"c" => Ok(Language::C),
42+
"js" | "javascript" => Ok(Language::Javascript),
43+
"go" | "golang" => Ok(Language::Go),
44+
"kt" | "kotlin" => Ok(Language::Kotlin),
45+
"swift" => Ok(Language::Swift),
46+
"ts" | "typescript" => Ok(Language::Typescript),
47+
"cs" | "csharp" => Ok(Language::Csharp),
48+
"rb" | "ruby" => Ok(Language::Ruby),
49+
"scala" => Ok(Language::Scala),
50+
"php" => Ok(Language::PHP),
51+
"rkt" | "racket" => Ok(Language::Racket),
52+
"erl" | "erlang" => Ok(Language::Erlang),
53+
"ex" | "elixer" => Ok(Language::Elixir),
54+
"dart" => Ok(Language::Dart),
55+
_ => Err(eyre::eyre!("Unknown language")),
9056
}
9157
}
58+
}
59+
60+
impl Language {
9261
pub fn extension(&self) -> &str {
9362
match self {
9463
Language::Rust => "rs",
@@ -111,12 +80,7 @@ impl Language {
11180
Language::Dart => "dart",
11281
}
11382
}
114-
pub fn to_string(&self) -> String {
115-
self.to_str().to_string()
116-
}
117-
}
11883

119-
impl Language {
12084
pub(crate) fn inline_comment_start(&self) -> &str {
12185
use Language::*;
12286
match self {

src/handlers/helpers.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::str::FromStr;
2+
13
use colored::Colorize;
24
use eyre::Result;
35
use serde::{Deserialize, Serialize};
@@ -74,8 +76,7 @@ pub(crate) struct BoilerPlateCode {
7476
use super::super::file_parser::language::Language;
7577
impl BoilerPlateCode {
7678
pub(crate) fn save_code(&self, filename: &str, title_slug: &str) -> Result<()> {
77-
let language = Language::from_slug(&self.langSlug)
78-
.ok_or_else(|| eyre::eyre!("Unable to identify language of code file!"))?;
79+
let language = Language::from_str(&self.langSlug)?;
7980
let mut file = std::fs::File::create(filename)?;
8081
let comment = format!(
8182
" {} #LCEND https://leetcode.com/problems/{}/",
@@ -90,11 +91,10 @@ impl BoilerPlateCode {
9091
Ok(())
9192
}
9293
pub(crate) fn is_supported(&self) -> bool {
93-
Language::from_slug(&self.langSlug).is_some()
94+
Language::from_str(&self.langSlug).is_ok()
9495
}
9596
pub(crate) fn extension(&self) -> Result<String> {
96-
let language = Language::from_slug(&self.langSlug)
97-
.ok_or_else(|| eyre::eyre!("Unable to identify language of code file!"))?;
97+
let language = Language::from_str(&self.langSlug)?;
9898
Ok(language.extension().to_owned())
9999
}
100100
}

0 commit comments

Comments
 (0)