From dac89209fdde17e2e4fdf89768e814945a8cea62 Mon Sep 17 00:00:00 2001 From: troido Date: Tue, 19 May 2020 15:06:45 +0200 Subject: better json parsing using serde_json::value::from_value --- src/components/interactable.rs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) (limited to 'src/components') diff --git a/src/components/interactable.rs b/src/components/interactable.rs index 757e27e..d97b742 100644 --- a/src/components/interactable.rs +++ b/src/components/interactable.rs @@ -1,5 +1,6 @@ use std::collections::HashMap; +use serde_json; use serde_json::{Value}; use specs::{ Component, @@ -33,20 +34,17 @@ impl Interactable { "trigger" => Trigger(Trigger::from_str(arg.as_str()?)?), "say" => Say(arg.as_str()?.to_string()), "reply" => Reply(arg.as_str()?.to_string()), - "exchange" => Exchange( - arg.get(0)?.as_str()?.to_string(), - arg.get(1)? - .as_object()? - .iter() - .map(|(id, ex)| { - let exchange = Exchange { - cost: ex.get(0)?.as_array()?.iter().map(|i| Some(ItemId(i.as_str()?.to_string()))).collect::>>()?, - offer: ex.get(1)?.as_array()?.iter().map(|i| Some(ItemId(i.as_str()?.to_string()))).collect::>>()? - }; - Some((id.clone(), exchange)) - }) - .collect::>>()? - ), + "exchange" => { + let (prefix, change) = serde_json::value::from_value::< + (String, HashMap, Vec)>) + >(arg.clone()).ok()?; + Exchange( + prefix, + change.into_iter().map( + |(id, (cost, offer))| (id, Exchange{cost, offer}) + ).collect::>() + ) + }, "visit" => Visit(RoomId::from_str(arg.as_str()?)), "mine" => Mine(Stat::from_str(arg.as_str()?)?), _ => None? -- cgit