Skip to content

Commit 87d80c1

Browse files
DSharifictz
authored andcommitted
feat: add const try_from_str constructor to DnsName type.
1 parent c6b5af3 commit 87d80c1

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

src/server_name.rs

+14-4
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,14 @@ impl<'a> DnsName<'a> {
204204
Err(_) => Err(s),
205205
}
206206
}
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+
}
207215
}
208216

209217
#[cfg(feature = "alloc")]
@@ -219,8 +227,7 @@ impl<'a> TryFrom<&'a str> for DnsName<'a> {
219227
type Error = InvalidDnsNameError;
220228

221229
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)
224231
}
225232
}
226233

@@ -300,7 +307,7 @@ impl fmt::Display for InvalidDnsNameError {
300307
#[cfg(feature = "std")]
301308
impl StdError for InvalidDnsNameError {}
302309

303-
fn validate(input: &[u8]) -> Result<(), InvalidDnsNameError> {
310+
const fn validate(input: &[u8]) -> Result<(), InvalidDnsNameError> {
304311
enum State {
305312
Start,
306313
Next,
@@ -323,7 +330,9 @@ fn validate(input: &[u8]) -> Result<(), InvalidDnsNameError> {
323330
return Err(InvalidDnsNameError);
324331
}
325332

326-
for ch in input {
333+
let mut idx = 0;
334+
while idx < input.len() {
335+
let ch = input[idx];
327336
state = match (state, ch) {
328337
(Start | Next | NextAfterNumericOnly | Hyphen { .. }, b'.') => {
329338
return Err(InvalidDnsNameError)
@@ -349,6 +358,7 @@ fn validate(input: &[u8]) -> Result<(), InvalidDnsNameError> {
349358
) => Subsequent { len: len + 1 },
350359
_ => return Err(InvalidDnsNameError),
351360
};
361+
idx += 1;
352362
}
353363

354364
if matches!(

0 commit comments

Comments
 (0)