# HG changeset patch # User alfadur # Date 1590004258 -10800 # Node ID 0b6094660557a2898cc04817ef07e3443d7043f2 # Parent 7d4f552e317f647b72917b5924228d0b47f5437b convert config from haskell lists diff -r 7d4f552e317f -r 0b6094660557 rust/hedgewars-server/src/server/demo.rs --- a/rust/hedgewars-server/src/server/demo.rs Wed May 20 19:38:44 2020 +0300 +++ b/rust/hedgewars-server/src/server/demo.rs Wed May 20 22:50:58 2020 +0300 @@ -318,9 +318,59 @@ let mut config = Vec::with_capacity(map_config.len() + game_config.len()); - for item in map_config {} + for item in map_config { + let mut tuple = item.into_tuple()?; + let mut tuple_iter = tuple.drain(..); + let name = tuple_iter.next()?.into_string()?; + let value = tuple_iter.next()?.into_string()?; + + let config_item = match &name[..] { + "FEATURE_SIZE" => GameCfg::FeatureSize(u32::from_str(&value).ok()?), + "MAP" => GameCfg::MapType(value), + "MAPGEN" => GameCfg::MapGenerator(u32::from_str(&value).ok()?), + "MAZE_SIZE" => GameCfg::MazeSize(u32::from_str(&value).ok()?), + "SEED" => GameCfg::Seed(value), + "TEMPLATE" => GameCfg::Template(u32::from_str(&value).ok()?), + "DRAWNMAP" => GameCfg::DrawnMap(value), + _ => None?, + }; + config.push(config_item); + } + + for item in game_config { + let mut tuple = item.into_tuple()?; + let mut tuple_iter = tuple.drain(..); + let name = tuple_iter.next()?.into_string()?; + let value = tuple_iter.next()?; - for item in game_config {} + let config_item = match &name[..] { + "AMMO" => { + let mut ammo = value.into_list()?; + let mut ammo_iter = ammo.drain(..); + GameCfg::Ammo( + ammo_iter.next()?.into_string()?, + ammo_iter.next().and_then(|v| v.into_string()), + ) + } + "SCHEME" => { + let mut scheme = value.into_list()?; + let mut scheme_iter = scheme.drain(..); + GameCfg::Scheme( + scheme_iter.next()?.into_string()?, + scheme_iter + .next()? + .into_list()? + .drain(..) + .filter_map(|v| v.into_string()) + .collect(), + ) + } + "SCRIPT" => GameCfg::Script(value.into_string()?), + "THEME" => GameCfg::Theme(value.into_string()?), + _ => None?, + }; + config.push(config_item); + } let mut messages = Vec::with_capacity(engine_messages.len()); diff -r 7d4f552e317f -r 0b6094660557 rust/hedgewars-server/src/server/haskell.rs --- a/rust/hedgewars-server/src/server/haskell.rs Wed May 20 19:38:44 2020 +0300 +++ b/rust/hedgewars-server/src/server/haskell.rs Wed May 20 22:50:58 2020 +0300 @@ -1,11 +1,12 @@ use crate::server::haskell::HaskellValue::Boolean; +use nom::multi::many0; use nom::{ branch::alt, bytes::complete::{escaped_transform, is_not, tag, take_while, take_while1}, character::{is_alphanumeric, is_digit, is_space}, combinator::{map, map_res}, multi::separated_list, - sequence::{delimited, pair, preceded, separated_pair}, + sequence::{delimited, pair, preceded, separated_pair, terminated}, ExtendInto, IResult, }; use std::{ @@ -329,7 +330,7 @@ identifier, preceded( take_while(is_space), - separated_list(take_while1(is_space), value), + many0(terminated(value, take_while(is_space))), ), ), |(name, mut fields)| HaskellValue::AnonStruct {