@@ -199,7 +199,48 @@ impl Crate {
199
199
name, MAX_NAME_LENGTH
200
200
) ) ) ;
201
201
}
202
- Crate :: valid_ident ( name, "crate name" )
202
+ Crate :: valid_create_ident ( name)
203
+ }
204
+
205
+ // Checks that the name is a valid crate name.
206
+ // 1. The name must be non-empty.
207
+ // 2. The first character must be an ASCII character.
208
+ // 3. The remaining characters must be ASCII alphanumerics or `-` or `_`.
209
+ // Note: This is different from `valid_dependency_name` because it allows
210
+ // `_` as the first character.
211
+ fn valid_create_ident ( name : & str ) -> AppResult < ( ) > {
212
+ if name. is_empty ( ) {
213
+ return Err ( cargo_err ( "the crate name cannot be an empty" ) ) ;
214
+ }
215
+ let mut chars = name. chars ( ) ;
216
+ if let Some ( ch) = chars. next ( ) {
217
+ if ch. is_ascii_digit ( ) {
218
+ return Err ( cargo_err ( & format ! (
219
+ "the name `{}` cannot be used as a crate name, \
220
+ the name cannot start with a digit",
221
+ name,
222
+ ) ) ) ;
223
+ }
224
+ if !ch. is_ascii_alphabetic ( ) {
225
+ return Err ( cargo_err ( & format ! (
226
+ "invalid character `{}` in crate name: `{}`, \
227
+ the first character must be an ASCII character",
228
+ ch, name
229
+ ) ) ) ;
230
+ }
231
+ }
232
+
233
+ for ch in chars {
234
+ if !( ch. is_ascii_alphanumeric ( ) || ch == '-' || ch == '_' ) {
235
+ return Err ( cargo_err ( & format ! (
236
+ "invalid character `{}` in crate name: `{}`, \
237
+ characters must be an ASCII alphanumeric characters, `-`, or `_`",
238
+ ch, name
239
+ ) ) ) ;
240
+ }
241
+ }
242
+
243
+ Ok ( ( ) )
203
244
}
204
245
205
246
pub fn valid_dependency_name ( name : & str ) -> AppResult < ( ) > {
@@ -209,41 +250,41 @@ impl Crate {
209
250
name, MAX_NAME_LENGTH
210
251
) ) ) ;
211
252
}
212
- Crate :: valid_ident ( name, "dependency name" )
253
+ Crate :: valid_dependency_ident ( name)
213
254
}
214
255
215
- // Checks that the name is a valid identifier .
256
+ // Checks that the name is a valid dependency name .
216
257
// 1. The name must be non-empty.
217
258
// 2. The first character must be an ASCII character or `_`.
218
259
// 3. The remaining characters must be ASCII alphanumerics or `-` or `_`.
219
- fn valid_ident ( name : & str , what : & str ) -> AppResult < ( ) > {
260
+ fn valid_dependency_ident ( name : & str ) -> AppResult < ( ) > {
220
261
if name. is_empty ( ) {
221
- return Err ( cargo_err ( & format ! ( "the {} cannot be an empty" , what ) ) ) ;
262
+ return Err ( cargo_err ( "the dependency name cannot be an empty" ) ) ;
222
263
}
223
264
let mut chars = name. chars ( ) ;
224
265
if let Some ( ch) = chars. next ( ) {
225
266
if ch. is_ascii_digit ( ) {
226
267
return Err ( cargo_err ( & format ! (
227
- "the name `{}` cannot be used as a {} , \
268
+ "the name `{}` cannot be used as a dependency name , \
228
269
the name cannot start with a digit",
229
- name, what ,
270
+ name,
230
271
) ) ) ;
231
272
}
232
273
if !( ch. is_ascii_alphabetic ( ) || ch == '_' ) {
233
274
return Err ( cargo_err ( & format ! (
234
- "invalid character `{}` in {} : `{}`, \
275
+ "invalid character `{}` in dependency name : `{}`, \
235
276
the first character must be an ASCII character, or `_`",
236
- ch, what , name
277
+ ch, name
237
278
) ) ) ;
238
279
}
239
280
}
240
281
241
282
for ch in chars {
242
283
if !( ch. is_ascii_alphanumeric ( ) || ch == '-' || ch == '_' ) {
243
284
return Err ( cargo_err ( & format ! (
244
- "invalid character `{}` in {} : `{}`, \
285
+ "invalid character `{}` in dependency name : `{}`, \
245
286
characters must be an ASCII alphanumeric characters, `-`, or `_`",
246
- ch, what , name
287
+ ch, name
247
288
) ) ) ;
248
289
}
249
290
}
@@ -549,7 +590,7 @@ mod tests {
549
590
assert ! ( Crate :: valid_name( "foo_underscore" ) . is_ok( ) ) ;
550
591
assert ! ( Crate :: valid_name( "foo-dash" ) . is_ok( ) ) ;
551
592
assert ! ( Crate :: valid_name( "foo+plus" ) . is_err( ) ) ;
552
- assert ! ( Crate :: valid_name( "_foo" ) . is_ok ( ) ) ;
593
+ assert ! ( Crate :: valid_name( "_foo" ) . is_err ( ) ) ;
553
594
assert ! ( Crate :: valid_name( "-foo" ) . is_err( ) ) ;
554
595
}
555
596
0 commit comments