@@ -204,6 +204,14 @@ impl<'a> DnsName<'a> {
204
204
Err ( _) => Err ( s) ,
205
205
}
206
206
}
207
+
208
+ /// Produces a borrowed [`DnsName`] from a borrowed [`str`].
209
+ pub const fn try_from_str ( s : & str ) -> Result < DnsName < ' _ > , InvalidDnsNameError > {
210
+ match validate ( s. as_bytes ( ) ) {
211
+ Ok ( _) => Ok ( DnsName ( DnsNameInner :: Borrowed ( s) ) ) ,
212
+ Err ( err) => Err ( err) ,
213
+ }
214
+ }
207
215
}
208
216
209
217
#[ cfg( feature = "alloc" ) ]
@@ -219,8 +227,7 @@ impl<'a> TryFrom<&'a str> for DnsName<'a> {
219
227
type Error = InvalidDnsNameError ;
220
228
221
229
fn try_from ( value : & ' a str ) -> Result < Self , Self :: Error > {
222
- validate ( value. as_bytes ( ) ) ?;
223
- Ok ( Self ( DnsNameInner :: Borrowed ( value) ) )
230
+ DnsName :: try_from_str ( value)
224
231
}
225
232
}
226
233
@@ -300,7 +307,7 @@ impl fmt::Display for InvalidDnsNameError {
300
307
#[ cfg( feature = "std" ) ]
301
308
impl StdError for InvalidDnsNameError { }
302
309
303
- fn validate ( input : & [ u8 ] ) -> Result < ( ) , InvalidDnsNameError > {
310
+ const fn validate ( input : & [ u8 ] ) -> Result < ( ) , InvalidDnsNameError > {
304
311
enum State {
305
312
Start ,
306
313
Next ,
@@ -323,7 +330,9 @@ fn validate(input: &[u8]) -> Result<(), InvalidDnsNameError> {
323
330
return Err ( InvalidDnsNameError ) ;
324
331
}
325
332
326
- for ch in input {
333
+ let mut idx = 0 ;
334
+ while idx < input. len ( ) {
335
+ let ch = input[ idx] ;
327
336
state = match ( state, ch) {
328
337
( Start | Next | NextAfterNumericOnly | Hyphen { .. } , b'.' ) => {
329
338
return Err ( InvalidDnsNameError )
@@ -349,6 +358,7 @@ fn validate(input: &[u8]) -> Result<(), InvalidDnsNameError> {
349
358
) => Subsequent { len : len + 1 } ,
350
359
_ => return Err ( InvalidDnsNameError ) ,
351
360
} ;
361
+ idx += 1 ;
352
362
}
353
363
354
364
if matches ! (
0 commit comments