Serde: Regression in serde_codegen

Created on 9 Aug 2016  路  5Comments  路  Source: serde-rs/serde

version before update: 0.7.4
version after update: 0.7.11

This function

impl Deserialize for Operation {
    fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
        where D: Deserializer {
        let v = try!(Value::deserialize(deserializer));
        if let Value::Object(ref map) = v.clone() {
            if let Some(&Value::String(ref s) = map.get("type") {
                let result = match s.as_ref() {
                    "constructor" => Deserialize::deserialize(&mut value::Deserializer::new(v)).map(Operation::Constructor),
                    "function" => Deserialize::deserialize(&mut value::Deserializer::new(v)).map(Operation::Function),
                    "event" => Deserialize::deserialize(&mut value::Deserializer::new(v)).map(Operation::Event),
                    _ => Err(SerdeError::custom("Invalid operation type.")),
                };

                return result.map_err(|e| D::Error::custom(format!("{:?}", e).as_ref()));
            }
        }
        Err(D::Error::custom("Invalid operation"))
    }
}

used to generate this code in version 0.7.4

    impl Deserialize for Operation {
        fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
         where D: Deserializer {
            let v = try!(Value :: deserialize ( deserializer ));
            if let Value::Object(ref map) = v.clone() {
                if let Some(&Value::String(ref s)) = map.get("type") {
                    let result =
                        match s.as_ref() {
                            "constructor" =>
                            Deserialize::deserialize(&mut value::Deserializer::new(v)).map(Operation::Constructor),
                            "function" =>
                            Deserialize::deserialize(&mut value::Deserializer::new(v)).map(Operation::Function),
                            "event" =>
                            Deserialize::deserialize(&mut value::Deserializer::new(v)).map(Operation::Event),
                            _ =>
                            Err(SerdeError::custom("Invalid operation type.")),
                        };
                    return result.map_err(|e|
                                              D::Error::custom(format!("{:?}"
                                                                       ,
                                                                       e).as_ref()));
                }
            }
            Err(D::Error::custom("Invalid operation"))
        }
    }

0.7.11 generates:

    impl Deserialize for Operation {
        fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
         where D: Deserializer {
            let v = try!(Value :: deserialize ( deserializer ));
            if let Value::Object(ref map) = v.clone() { }
            Err(D::Error::custom("Invalid operation"))
        }
    }
bug

Most helpful comment

I reported this in the syntex repository ( https://github.com/serde-rs/syntex/issues/86 ).

All 5 comments

this sounds to me like a syntex regression.

have you tried going to 0.7.15 ?

have you tried going to 0.7.15 ?

Still broken

you are missing a bracket in if let Some(&Value::String(ref s) = map.get("type"), syntex should report an error and not do weird stuff, but still :)

I reported this in the syntex repository ( https://github.com/serde-rs/syntex/issues/86 ).

This bug is fixed in Syntex 0.42.1. I don't think anyone is urgently waiting for a fix here so I won't bump Serde's Syntex dependency but it will get picked up the next time we bump.

Was this page helpful?
0 / 5 - 0 ratings