From 47f3aa6247a3211ae499b30584dca6acb43d2204 Mon Sep 17 00:00:00 2001
From: liamchristopher <liamchristopher@gmail.com>
Date: Thu, 30 Mar 2017 14:34:46 -0700
Subject: [PATCH] feat(version): impl `FromStr` for `HttpVersion`

---
 src/version.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/src/version.rs b/src/version.rs
index 1c840796da..1abe1c7352 100644
--- a/src/version.rs
+++ b/src/version.rs
@@ -3,7 +3,9 @@
 //! Instead of relying on typo-prone Strings, use expected HTTP versions as
 //! the `HttpVersion` enum.
 use std::fmt;
+use std::str::FromStr;
 
+use error::Error;
 use self::HttpVersion::{Http09, Http10, Http11, H2, H2c};
 
 /// Represents a version of the HTTP spec.
@@ -36,8 +38,54 @@ impl fmt::Display for HttpVersion {
     }
 }
 
+impl FromStr for HttpVersion {
+    type Err = Error;
+    fn from_str(s: &str) -> Result<HttpVersion, Error> {
+        Ok(match s {
+            "HTTP/0.9" => Http09,
+            "HTTP/1.0" => Http10,
+            "HTTP/1.1" => Http11,
+            "h2" => H2,
+            "h2c" => H2c,
+            _ => return Err(Error::Version),
+        })
+    }
+}
+
 impl Default for HttpVersion {
     fn default() -> HttpVersion {
         Http11
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use std::str::FromStr;
+    use error::Error;
+    use super::HttpVersion;
+    use super::HttpVersion::{Http09,Http10,Http11,H2,H2c};
+
+    #[test]
+    fn test_default() {
+        assert_eq!(Http11, HttpVersion::default());
+    }
+
+    #[test]
+    fn test_from_str() {
+        assert_eq!(Http09, HttpVersion::from_str("HTTP/0.9").unwrap());
+        assert_eq!(Http10, HttpVersion::from_str("HTTP/1.0").unwrap());
+        assert_eq!(Http11, HttpVersion::from_str("HTTP/1.1").unwrap());
+        assert_eq!(H2, HttpVersion::from_str("h2").unwrap());
+        assert_eq!(H2c, HttpVersion::from_str("h2c").unwrap());
+    }
+
+    #[test]
+    fn test_from_str_panic() {
+        match HttpVersion::from_str("foo") {
+            Err(Error::Version) => assert!(true),
+            Err(_) => assert!(false),
+            Ok(_) => assert!(false),
+        }
+    }
+        
+}