Hi Daneel,

What seems to be happening (which others might be able to confirm) is that
the JSON decoder is consuming the string as a stack, and after the first
read_int() fails, there is no nothing left to pop (in
doc.rust-lang.org/src/serialize/home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libserialize/json.rs.html#1916),
which causes the subsequent read_str() to fail. You can double-check this
by removing the `read_int()` call, after which the `read_str()` works.

Cheers,

Tim Joseph Dumol

On Fri, Sep 19, 2014 at 12:40 AM, Tim Joseph Dumol <[email protected]> wrote:

> Whoops, my bad! I misread your code in my haste to answer your question.
> I'm a newbie to Rust, actually, so I'll have to spend some time exploring
> why this is happening. Maybe someone else can help faster. Sorry for the
> confusion!
>
> Tim Joseph Dumol
>
> On Fri, Sep 19, 2014 at 12:23 AM, Daneel Yaitskov <
> [email protected]> wrote:
>
>> Why does read_str returns Result? I cannot catch the Err because of fail!
>> It looks weird. Where is the sense?
>>
>> Just String result would better fit to read_str wiith such behavior,
>> wouldn't it?
>>
>> Here is another question. Have Rust standard painless  method to
>> deserialize json map with different primitive value types (int, string,
>> bool...)?
>>
>> json::decode(String) -> Option<HashMap<String,String>>
>> or
>> json::decode(String) -> Option<HashMap<String,Primitive>>
>>
>> where
>> enum Primitive { Pint(int), Pstr(String), .... }
>>
>> On Sep 18, 2014 7:52 PM, "Tim Joseph Dumol" <[email protected]> wrote:
>>
>>> Hi Daneel,
>>>
>>> Your `read_str` function tried to unwrap an `Option` that turned out to
>>> be `None`, which caused your error. You'll want to `match` on the that
>>> `Option` instead and handle for the case when it's a `None`. Good luck!
>>>
>>> Cheers,
>>>
>>> Tim Joseph Dumol
>>>
>>> On Thu, Sep 18, 2014 at 11:44 PM, Daneel Yaitskov <
>>> [email protected]> wrote:
>>>
>>>> I have a custom json deserializer. It can parse string or number.
>>>>
>>>> json functions return Result enum so I guess if it fails it should
>>>> return
>>>> Err. But lines println!("crap") or println!("string is ok")  are not
>>>> reached.
>>>>
>>>> Program crashes with the following output:
>>>>
>>>> not int. let's try string
>>>> task '<main>' failed at 'called `Option::unwrap()` on a `None` value',
>>>> /home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libcore/
>>>> option.rs:278
>>>>
>>>>
>>>> extern crate serialize;
>>>> use serialize::{json, Decodable, Decoder};
>>>>
>>>> fn main() {
>>>>     let raw_json = "\"ddd\"";
>>>>     let person: Primitive = json::decode(raw_json).unwrap();
>>>>     println!("{}", person);
>>>> }
>>>>
>>>> #[deriving(Show)]
>>>> enum Primitive { ItInt(int), ItStr(String) }
>>>>
>>>> impl<S: Decoder<E>, E> Decodable<S, E> for Primitive {
>>>>     fn decode(decoder: &mut S) -> Result<Primitive, E> {
>>>>         match decoder.read_int() {
>>>>             Ok(n) => Ok(ItInt(n)),
>>>>             _     => {
>>>>                 println!("not int. let's try string");
>>>>                 match decoder.read_str() {
>>>>                     Ok(s) => {
>>>>                         println!("string is ok");
>>>>                         Ok(ItStr(s))
>>>>                     },
>>>>                     _     => {
>>>>                         println!("crap");
>>>>                         Ok(ItStr("DDD".to_string()))
>>>>                     }
>>>>                 }
>>>>             }
>>>>         }
>>>>     }
>>>> }
>>>>
>>>> --
>>>> Daneel S. Yaitskov
>>>>
>>>> _______________________________________________
>>>> Rust-dev mailing list
>>>> [email protected]
>>>> https://mail.mozilla.org/listinfo/rust-dev
>>>>
>>>>
>>>
>
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to