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