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
