Skip to content

Commit eefeee1

Browse files
committed
refactor: Language extension mapping to use static HashMap
1 parent 77de2b8 commit eefeee1

File tree

1 file changed

+33
-26
lines changed

1 file changed

+33
-26
lines changed

src/file_manager/models.rs

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::errors::LanguageError;
22

33
use chrono::{DateTime, Utc};
44
use serde::{Deserialize, Serialize};
5+
use std::{collections::HashMap, sync::LazyLock};
56

67
#[derive(Debug, Serialize, Deserialize)]
78
pub struct FileMetadata {
@@ -25,7 +26,7 @@ pub struct UpdateFilenameRequest {
2526
pub new_filename: String,
2627
}
2728

28-
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
29+
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone)]
2930
#[serde(rename_all = "lowercase")]
3031
pub enum Language {
3132
C,
@@ -51,6 +52,32 @@ pub enum Language {
5152
Text,
5253
}
5354

55+
static EXTENSION_TO_LANGUAGE: LazyLock<HashMap<&'static str, Language>> = LazyLock::new(|| {
56+
HashMap::from([
57+
("c", Language::C),
58+
("cpp", Language::Cpp),
59+
("cs", Language::Csharp),
60+
("d", Language::D),
61+
("go", Language::Go),
62+
("in", Language::Input),
63+
("java", Language::Java),
64+
("js", Language::Javascript),
65+
("kt", Language::Kotlin),
66+
("md", Language::Markdown),
67+
("ml", Language::Ocaml),
68+
("out", Language::Output),
69+
("pas", Language::Pascal),
70+
("pl", Language::Perl),
71+
("php", Language::Php),
72+
("py", Language::Python),
73+
("rb", Language::Ruby),
74+
("rs", Language::Rust),
75+
("scala", Language::Scala),
76+
("ts", Language::Typescript),
77+
("txt", Language::Text),
78+
])
79+
});
80+
5481
impl Language {
5582
pub fn from_filename(filename: &str) -> Result<Self, LanguageError> {
5683
if !filename.contains('.') || filename.starts_with('.') {
@@ -59,7 +86,7 @@ impl Language {
5986

6087
let extension = filename
6188
.split('.')
62-
.last()
89+
.next_back()
6390
.ok_or(LanguageError::InvalidFilename)?
6491
.to_lowercase();
6592

@@ -71,30 +98,10 @@ impl Language {
7198
}
7299

73100
pub fn from_extension(extension: &str) -> Result<Self, LanguageError> {
74-
match extension {
75-
"c" => Ok(Language::C),
76-
"cpp" => Ok(Language::Cpp),
77-
"cs" => Ok(Language::Csharp),
78-
"d" => Ok(Language::D),
79-
"go" => Ok(Language::Go),
80-
"in" => Ok(Language::Input),
81-
"java" => Ok(Language::Java),
82-
"js" => Ok(Language::Javascript),
83-
"kt" => Ok(Language::Kotlin),
84-
"md" => Ok(Language::Markdown),
85-
"ml" => Ok(Language::Ocaml),
86-
"out" => Ok(Language::Output),
87-
"pas" => Ok(Language::Pascal),
88-
"pl" => Ok(Language::Perl),
89-
"php" => Ok(Language::Php),
90-
"py" => Ok(Language::Python),
91-
"rb" => Ok(Language::Ruby),
92-
"rs" => Ok(Language::Rust),
93-
"scala" => Ok(Language::Scala),
94-
"ts" => Ok(Language::Typescript),
95-
"txt" => Ok(Language::Text),
96-
_ => Err(LanguageError::UnsupportedExtension(extension.to_string())),
97-
}
101+
EXTENSION_TO_LANGUAGE
102+
.get(&extension.to_lowercase() as &str)
103+
.cloned()
104+
.ok_or(LanguageError::UnsupportedExtension(extension.to_string()))
98105
}
99106
}
100107

0 commit comments

Comments
 (0)