1- #[ derive( Default , Clone , Copy ) ]
1+ use std:: { fmt, str:: FromStr } ;
2+
3+ #[ derive( Debug , Default , Clone , Copy ) ]
24pub 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 {
0 commit comments