@@ -4,62 +4,70 @@ pub fn cmp_module_specifiers(a: &str, b: &str, cmp_text: impl Fn(&str, &str) ->
4
4
let a_info = get_module_specifier_info ( a) ;
5
5
let b_info = get_module_specifier_info ( b) ;
6
6
7
- return match a_info. kind {
8
- ModuleSpecifierKind :: Absolute => {
9
- match b_info. kind {
10
- ModuleSpecifierKind :: Absolute => compare_folder_items ( & a_info, & b_info, cmp_text) ,
11
- ModuleSpecifierKind :: Relative ( _) => Ordering :: Less ,
7
+ return match & a_info {
8
+ ModuleSpecifierInfo :: Absolute {
9
+ text : a_text,
10
+ } => {
11
+ match b_info {
12
+ ModuleSpecifierInfo :: Absolute { text : b_text } => cmp_text ( a_text, b_text) ,
13
+ ModuleSpecifierInfo :: Relative { .. } => Ordering :: Less ,
12
14
}
13
15
} ,
14
- ModuleSpecifierKind :: Relative ( a_relative_count) => {
15
- match b_info. kind {
16
- ModuleSpecifierKind :: Absolute => Ordering :: Greater ,
17
- ModuleSpecifierKind :: Relative ( b_relative_count) => {
16
+ ModuleSpecifierInfo :: Relative {
17
+ relative_count : a_relative_count,
18
+ folder_items : a_folder_items,
19
+ } => {
20
+ match & b_info {
21
+ ModuleSpecifierInfo :: Absolute { .. } => Ordering :: Greater ,
22
+ ModuleSpecifierInfo :: Relative {
23
+ relative_count : b_relative_count,
24
+ folder_items : b_folder_items,
25
+ } => {
18
26
match a_relative_count. cmp ( & b_relative_count) {
19
27
Ordering :: Greater => Ordering :: Less ,
20
28
Ordering :: Less => Ordering :: Greater ,
21
- Ordering :: Equal => compare_folder_items ( & a_info , & b_info , cmp_text) ,
29
+ Ordering :: Equal => compare_folder_items ( a_folder_items , b_folder_items , cmp_text) ,
22
30
}
23
31
} ,
24
32
}
25
33
}
26
34
} ;
27
35
28
- fn compare_folder_items ( a_info : & ModuleSpecifierInfo , b_info : & ModuleSpecifierInfo , cmp_text : impl Fn ( & str , & str ) -> Ordering ) -> Ordering {
29
- let max_len = std:: cmp:: min ( a_info . folder_items . len ( ) , b_info . folder_items . len ( ) ) ;
36
+ fn compare_folder_items ( a_folder_items : & Vec < & ' _ str > , b_folder_items : & Vec < & ' _ str > , cmp_text : impl Fn ( & str , & str ) -> Ordering ) -> Ordering {
37
+ let max_len = std:: cmp:: min ( a_folder_items . len ( ) , b_folder_items . len ( ) ) ;
30
38
// compare the common items except for the potential file name at the end
31
39
for i in 0 ..max_len - 1 {
32
- let a_text = a_info . folder_items [ i] ;
33
- let b_text = b_info . folder_items [ i] ;
40
+ let a_text = a_folder_items [ i] ;
41
+ let b_text = b_folder_items [ i] ;
34
42
let ordering = cmp_text ( a_text, b_text) ;
35
43
if ordering != Ordering :: Equal {
36
44
return ordering;
37
45
}
38
46
}
39
47
40
- if a_info . folder_items . len ( ) != b_info . folder_items . len ( ) {
48
+ if a_folder_items . len ( ) != b_folder_items . len ( ) {
41
49
// the import that has a folder name should appear before the one with a file name
42
- if a_info . folder_items . len ( ) > b_info . folder_items . len ( ) {
50
+ if a_folder_items . len ( ) > b_folder_items . len ( ) {
43
51
Ordering :: Less
44
52
} else {
45
53
Ordering :: Greater
46
54
}
47
55
} else {
48
56
// compare the file names
49
- cmp_text ( a_info . folder_items . last ( ) . unwrap ( ) , b_info . folder_items . last ( ) . unwrap ( ) )
57
+ cmp_text ( a_folder_items . last ( ) . unwrap ( ) , b_folder_items . last ( ) . unwrap ( ) )
50
58
}
51
59
}
52
60
}
53
61
54
- struct ModuleSpecifierInfo < ' a > {
55
- kind : ModuleSpecifierKind ,
56
- folder_items : Vec < & ' a str > ,
57
- }
58
-
59
62
#[ derive( Debug , PartialEq ) ]
60
- enum ModuleSpecifierKind {
61
- Absolute ,
62
- Relative ( usize ) ,
63
+ enum ModuleSpecifierInfo < ' a > {
64
+ Absolute {
65
+ text : & ' a str ,
66
+ } ,
67
+ Relative {
68
+ relative_count : usize ,
69
+ folder_items : Vec < & ' a str > ,
70
+ } ,
63
71
}
64
72
65
73
fn get_module_specifier_info < ' a > ( text : & ' a str ) -> ModuleSpecifierInfo < ' a > {
@@ -81,14 +89,13 @@ fn get_module_specifier_info<'a>(text: &'a str) -> ModuleSpecifierInfo<'a> {
81
89
start_index += part. len ( ) + next_slash_width;
82
90
}
83
91
84
- ModuleSpecifierInfo {
92
+ ModuleSpecifierInfo :: Relative {
93
+ relative_count,
85
94
folder_items : no_quotes_text[ start_index..] . split ( '/' ) . collect ( ) ,
86
- kind : ModuleSpecifierKind :: Relative ( relative_count) ,
87
95
}
88
96
} else {
89
- ModuleSpecifierInfo {
90
- folder_items : no_quotes_text. split ( '/' ) . collect ( ) ,
91
- kind : ModuleSpecifierKind :: Absolute ,
97
+ ModuleSpecifierInfo :: Absolute {
98
+ text : no_quotes_text,
92
99
}
93
100
}
94
101
}
@@ -116,39 +123,50 @@ mod test {
116
123
#[ test]
117
124
fn it_should_get_module_specifier_info_when_empty ( ) {
118
125
let result = get_module_specifier_info ( "''" ) ;
119
- assert_eq ! ( result. folder_items, vec![ "" ] ) ;
120
- assert_eq ! ( result. kind, ModuleSpecifierKind :: Absolute ) ;
126
+ assert_eq ! ( result, ModuleSpecifierInfo :: Absolute {
127
+ text: "" ,
128
+ } ) ;
121
129
}
122
130
123
131
#[ test]
124
132
fn it_should_get_module_specifier_info_for_absolute ( ) {
125
133
// double quotes
126
134
let result = get_module_specifier_info ( r#""testing/asdf""# ) ;
127
- assert_eq ! ( result. folder_items, vec![ "testing" , "asdf" ] ) ;
128
- assert_eq ! ( result. kind, ModuleSpecifierKind :: Absolute ) ;
135
+ assert_eq ! ( result, ModuleSpecifierInfo :: Absolute {
136
+ text: "testing/asdf" ,
137
+ } ) ;
129
138
130
139
// single quotes
131
140
let result = get_module_specifier_info ( "'testing'" ) ;
132
- assert_eq ! ( result. folder_items, vec![ "testing" ] ) ;
133
- assert_eq ! ( result. kind, ModuleSpecifierKind :: Absolute ) ;
141
+ assert_eq ! ( result, ModuleSpecifierInfo :: Absolute {
142
+ text: "testing" ,
143
+ } ) ;
134
144
}
135
145
136
146
#[ test]
137
147
fn it_should_get_module_specifier_info_for_relative ( ) {
138
148
let result = get_module_specifier_info ( "'./a'" ) ;
139
- assert_eq ! ( result. folder_items, vec![ "a" ] ) ;
140
- assert_eq ! ( result. kind, ModuleSpecifierKind :: Relative ( 0 ) ) ;
149
+ assert_eq ! ( result, ModuleSpecifierInfo :: Relative {
150
+ relative_count: 0 ,
151
+ folder_items: vec![ "a" ] ,
152
+ } ) ;
141
153
142
154
let result = get_module_specifier_info ( "'./../testing-test/t'" ) ;
143
- assert_eq ! ( result. folder_items, vec![ "testing-test" , "t" ] ) ;
144
- assert_eq ! ( result. kind, ModuleSpecifierKind :: Relative ( 1 ) ) ;
155
+ assert_eq ! ( result, ModuleSpecifierInfo :: Relative {
156
+ relative_count: 1 ,
157
+ folder_items: vec![ "testing-test" , "t" ] ,
158
+ } ) ;
145
159
146
160
let result = get_module_specifier_info ( "'../asdf'" ) ;
147
- assert_eq ! ( result. folder_items, vec![ "asdf" ] ) ;
148
- assert_eq ! ( result. kind, ModuleSpecifierKind :: Relative ( 1 ) ) ;
161
+ assert_eq ! ( result, ModuleSpecifierInfo :: Relative {
162
+ relative_count: 1 ,
163
+ folder_items: vec![ "asdf" ] ,
164
+ } ) ;
149
165
150
166
let result = get_module_specifier_info ( "'../../../test'" ) ;
151
- assert_eq ! ( result. folder_items, vec![ "test" ] ) ;
152
- assert_eq ! ( result. kind, ModuleSpecifierKind :: Relative ( 3 ) ) ;
167
+ assert_eq ! ( result, ModuleSpecifierInfo :: Relative {
168
+ relative_count: 3 ,
169
+ folder_items: vec![ "test" ] ,
170
+ } ) ;
153
171
}
154
172
}
0 commit comments