jid: Move node and resource validation to functions

Emmanuel Gil Peyrot created

This simplifies the flow of the checks.

Change summary

jid/src/lib.rs | 32 ++++++++++++++++----------------
1 file changed, 16 insertions(+), 16 deletions(-)

Detailed changes

jid/src/lib.rs 🔗

@@ -82,6 +82,18 @@ fn length_check(len: usize, error_empty: Error, error_too_long: Error) -> Result
     }
 }
 
+fn node_check(node: &str) -> Result<Cow<'_, str>, Error> {
+    let node = nodeprep(node).map_err(|_| Error::NodePrep)?;
+    length_check(node.len(), Error::NodeEmpty, Error::NodeTooLong)?;
+    Ok(node)
+}
+
+fn resource_check(resource: &str) -> Result<Cow<'_, str>, Error> {
+    let resource = resourceprep(resource).map_err(|_| Error::ResourcePrep)?;
+    length_check(resource.len(), Error::ResourceEmpty, Error::ResourceTooLong)?;
+    Ok(resource)
+}
+
 fn domain_check(mut domain: &str) -> Result<Cow<'_, str>, Error> {
     // First, check if this is an IPv4 address.
     if Ipv4Addr::from_str(domain).is_ok() {
@@ -212,15 +224,9 @@ impl Jid {
                 if let Some(second_index) = iter.next() {
                     let byte = bytes[second_index];
                     if byte == b'/' {
-                        let node =
-                            nodeprep(&unnormalized[..first_index]).map_err(|_| Error::NodePrep)?;
-                        length_check(node.len(), Error::NodeEmpty, Error::NodeTooLong)?;
-
+                        let node = node_check(&unnormalized[..first_index])?;
                         let domain = domain_check(&unnormalized[first_index + 1..second_index])?;
-
-                        let resource = resourceprep(&unnormalized[second_index + 1..])
-                            .map_err(|_| Error::ResourcePrep)?;
-                        length_check(resource.len(), Error::ResourceEmpty, Error::ResourceTooLong)?;
+                        let resource = resource_check(&unnormalized[second_index + 1..])?;
 
                         orig_at = Some(node.len());
                         orig_slash = Some(node.len() + domain.len() + 1);
@@ -238,10 +244,7 @@ impl Jid {
                 } else {
                     // That is a node@domain JID.
 
-                    let node =
-                        nodeprep(&unnormalized[..first_index]).map_err(|_| Error::NodePrep)?;
-                    length_check(node.len(), Error::NodeEmpty, Error::NodeTooLong)?;
-
+                    let node = node_check(&unnormalized[..first_index])?;
                     let domain = domain_check(&unnormalized[first_index + 1..])?;
 
                     orig_at = Some(node.len());
@@ -258,10 +261,7 @@ impl Jid {
                 // characters.
 
                 let domain = domain_check(&unnormalized[..first_index])?;
-
-                let resource = resourceprep(&unnormalized[first_index + 1..])
-                    .map_err(|_| Error::ResourcePrep)?;
-                length_check(resource.len(), Error::ResourceEmpty, Error::ResourceTooLong)?;
+                let resource = resource_check(&unnormalized[first_index + 1..])?;
 
                 orig_at = None;
                 orig_slash = Some(domain.len());