]> git.lizzy.rs Git - rust.git/commitdiff
Implement FromStr for RelroLevel rather than duplicating the match
authorJohannes Löthberg <johannes@kyriasis.com>
Mon, 17 Jul 2017 23:27:55 +0000 (01:27 +0200)
committerJohannes Löthberg <johannes@kyriasis.com>
Mon, 17 Jul 2017 23:27:55 +0000 (01:27 +0200)
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
src/librustc/session/config.rs
src/librustc_back/lib.rs
src/librustc_back/target/mod.rs

index a5fa6c845bb531efc609569279b30ee68e838b6e..5661c4123022d09a54be2c6f07a1ca4f81b2d3b1 100644 (file)
@@ -790,9 +790,12 @@ fn parse_panic_strategy(slot: &mut Option<PanicStrategy>, v: Option<&str>) -> bo
 
         fn parse_relro_level(slot: &mut Option<RelroLevel>, v: Option<&str>) -> bool {
             match v {
-                Some("full") => *slot = Some(RelroLevel::Full),
-                Some("partial") => *slot = Some(RelroLevel::Partial),
-                Some("off") => *slot = Some(RelroLevel::Off),
+                Some(s) => {
+                    match s.parse::<RelroLevel>() {
+                        Ok(level) => *slot = Some(level),
+                        _ => return false
+                    }
+                },
                 _ => return false
             }
             true
index 7ec9b77af4bfc9b96b3a51779d18e645d54733a3..55b39f226701fb450f5120b32b8021c26240022b 100644 (file)
@@ -47,6 +47,8 @@
 pub mod slice;
 pub mod dynamic_lib;
 
+use std::str::FromStr;
+
 use serialize::json::{Json, ToJson};
 
 macro_rules! linker_flavor {
@@ -132,6 +134,19 @@ pub fn desc(&self) -> &str {
     }
 }
 
+impl FromStr for RelroLevel {
+    type Err = ();
+
+    fn from_str(s: &str) -> Result<RelroLevel, ()> {
+        match s {
+            "full" => Ok(RelroLevel::Full),
+            "partial" => Ok(RelroLevel::Partial),
+            "off" => Ok(RelroLevel::Off),
+            _ => Err(()),
+        }
+    }
+}
+
 impl ToJson for RelroLevel {
     fn to_json(&self) -> Json {
         match *self {
index a07f5d154a18414759698cc79de47f391be0f136..0dbfdb4d809e025722f78dfce92a63bded502144 100644 (file)
@@ -588,10 +588,8 @@ macro_rules! key {
             ($key_name:ident, RelroLevel) => ( {
                 let name = (stringify!($key_name)).replace("_", "-");
                 obj.find(&name[..]).and_then(|o| o.as_string().and_then(|s| {
-                    match s {
-                        "full" => base.options.$key_name = RelroLevel::Full,
-                        "partial" => base.options.$key_name = RelroLevel::Partial,
-                        "off" => base.options.$key_name = RelroLevel::Off,
+                    match s.parse::<RelroLevel>() {
+                        Ok(level) => base.options.$key_name = level,
                         _ => return Some(Err(format!("'{}' is not a valid value for \
                                                       relro-level. Use 'full', 'partial, or 'off'.",
                                                       s))),