@@ -2,6 +2,7 @@ use crate::errors::LanguageError;
22
33use chrono:: { DateTime , Utc } ;
44use serde:: { Deserialize , Serialize } ;
5+ use std:: { collections:: HashMap , sync:: LazyLock } ;
56
67#[ derive( Debug , Serialize , Deserialize ) ]
78pub 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" ) ]
3031pub 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+
5481impl 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