Skip to content

Commit

Permalink
feat: add const try_from_str constructor to DnsName type.
Browse files Browse the repository at this point in the history
  • Loading branch information
DSharifi authored and ctz committed Jan 27, 2025
1 parent c6b5af3 commit 87d80c1
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions src/server_name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,14 @@ impl<'a> DnsName<'a> {
Err(_) => Err(s),
}
}

/// Produces a borrowed [`DnsName`] from a borrowed [`str`].
pub const fn try_from_str(s: &str) -> Result<DnsName<'_>, InvalidDnsNameError> {
match validate(s.as_bytes()) {
Ok(_) => Ok(DnsName(DnsNameInner::Borrowed(s))),
Err(err) => Err(err),
}
}
}

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

fn try_from(value: &'a str) -> Result<Self, Self::Error> {
validate(value.as_bytes())?;
Ok(Self(DnsNameInner::Borrowed(value)))
DnsName::try_from_str(value)
}
}

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

fn validate(input: &[u8]) -> Result<(), InvalidDnsNameError> {
const fn validate(input: &[u8]) -> Result<(), InvalidDnsNameError> {
enum State {
Start,
Next,
Expand All @@ -323,7 +330,9 @@ fn validate(input: &[u8]) -> Result<(), InvalidDnsNameError> {
return Err(InvalidDnsNameError);
}

for ch in input {
let mut idx = 0;
while idx < input.len() {
let ch = input[idx];
state = match (state, ch) {
(Start | Next | NextAfterNumericOnly | Hyphen { .. }, b'.') => {
return Err(InvalidDnsNameError)
Expand All @@ -349,6 +358,7 @@ fn validate(input: &[u8]) -> Result<(), InvalidDnsNameError> {
) => Subsequent { len: len + 1 },
_ => return Err(InvalidDnsNameError),
};
idx += 1;
}

if matches!(
Expand Down

0 comments on commit 87d80c1

Please sign in to comment.