# HG changeset patch # User unc0rr # Date 1483653621 -10800 # Node ID a4d22f197bd2291878344c8ab651605c4db0384e # Parent 6273f89ab13d4faa8760d8e3c2e56d4a97bbdd32 Still trying to make parser work diff -r 6273f89ab13d -r a4d22f197bd2 gameServer2/src/protocol/hwprotocol.lalrpop --- a/gameServer2/src/protocol/hwprotocol.lalrpop Thu Jan 05 19:07:01 2017 +0300 +++ b/gameServer2/src/protocol/hwprotocol.lalrpop Fri Jan 06 01:00:21 2017 +0300 @@ -1,17 +1,40 @@ -use std::str; +use std::string; +use std::str::FromStr; use super::messages::HWProtocolMessage::*; -use super::messages::HWProtocolMessage; +use super::messages::*; grammar; -pub ProtocolMessage: HWProtocolMessage<'input> = { - "NICK" => Nick(s), +pub ProtocolMessage: HWProtocolMessage = { + "\n\n", +}; + +SpecificMessage: HWProtocolMessage = { + "NICK" "\n" => Nick(<>), + "PONG" => Pong, + "PING" => Ping, + "PROTO" "\n" => Proto(<>), }; -Str: &'input str = { - => s, +Num32: u32 = + => number(<>); + +ProtocolString: String = + => <>.join(""); + +ProtocolChar: &'input str = + r"[^\n]" => <>; + +Digit: u8 = { + "0" => 0, + "1" => 1, + "2" => 2, + "3" => 3, + "4" => 4, + "5" => 5, + "6" => 6, + "7" => 7, + "8" => 8, + "9" => 9, }; - - -//Num32: i32 = => i32::from_str(s).unwrap(); diff -r 6273f89ab13d -r a4d22f197bd2 gameServer2/src/protocol/lexer.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/protocol/lexer.rs Fri Jan 06 01:00:21 2017 +0300 @@ -0,0 +1,38 @@ +pub type Spanned = Result<(Loc, Tok, Loc), Error>; + +#[derive(Debug)] +pub enum Tok { + Linefeed, +} + +#[derive(Debug)] +pub enum LexicalError { + // Not possible +} + +use std::str::CharIndices; + +pub struct Lexer<'input> { + chars: CharIndices<'input>, +} + +impl<'input> Lexer<'input> { + pub fn new(input: &'input str) -> Self { + Lexer { chars: input.char_indices() } + } +} + +impl<'input> Iterator for Lexer<'input> { + type Item = Spanned; + + fn next(&mut self) -> Option { + loop { + match self.chars.next() { + Some((i, '\n')) => return Some(Ok((i, Tok::Linefeed, i+1))), + + None => return None, // End of file + _ => continue, // Comment; skip this character + } + } + } +} diff -r 6273f89ab13d -r a4d22f197bd2 gameServer2/src/protocol/messages.rs --- a/gameServer2/src/protocol/messages.rs Thu Jan 05 19:07:01 2017 +0300 +++ b/gameServer2/src/protocol/messages.rs Fri Jan 06 01:00:21 2017 +0300 @@ -1,46 +1,49 @@ use server::coretypes::{ServerVar, GameCfg, TeamInfo, HedgehogInfo}; +use std; +use std::ops; +use std::convert::From; - -pub enum HWProtocolMessage<'a> { +#[derive(PartialEq, Debug)] +pub enum HWProtocolMessage { // core Ping, Pong, - Quit(Option<&'a str>), - //Cmd(&'a str, Vec<&'a str>), - Global(&'a str), - Watch(&'a str), + Quit(Option), + //Cmd(String, Vec), + Global(String), + Watch(String), ToggleServerRegisteredOnly, SuperPower, - Info(&'a str), + Info(String), // not entered state - Nick(&'a str), + Nick(String), Proto(u32), - Password(&'a str, &'a str), - Checker(&'a str), + Password(String, String), + Checker(String), // lobby List, - Chat(&'a str), - CreateRoom(&'a str, Option<&'a str>), - Join(&'a str, Option<&'a str>), - Follow(&'a str), - Rnd(Vec<&'a str>), - Kick(&'a str), - Ban(&'a str, &'a str, u32), - BanIP(&'a str, &'a str, u32), - BanNick(&'a str, &'a str, u32), + Chat(String), + CreateRoom(String, Option), + Join(String, Option), + Follow(String), + Rnd(Vec), + Kick(String), + Ban(String, String, u32), + BanIP(String, String, u32), + BanNick(String, String, u32), BanList, - Unban(&'a str), + Unban(String), SetServerVar(ServerVar), GetServerVar, RestartServer, Stats, // in room - Part(Option<&'a str>), + Part(Option), Cfg(GameCfg), AddTeam(TeamInfo), - RemoveTeam(&'a str), - SetHedgehogsNumber(&'a str, u8), - SetTeamColor(&'a str, u8), + RemoveTeam(String), + SetHedgehogsNumber(String, u8), + SetTeamColor(String, u8), ToggleReady, StartGame, EngineMessage, @@ -48,18 +51,31 @@ ToggleRestrictJoin, ToggleRestrictTeams, ToggleRegisteredOnly, - RoomName(&'a str), - Delegate(&'a str), - TeamChat(&'a str), + RoomName(String), + Delegate(String), + TeamChat(String), MaxTeams(u8), Fix, Unfix, - Greeting(&'a str), - CallVote(Option<(&'a str, Option<&'a str>)>), - Vote(&'a str), - ForceVote(&'a str), - Save(&'a str, &'a str), - Delete(&'a str, &'a str), - SaveRoom(&'a str), - LoadRoom(&'a str), + Greeting(String), + CallVote(Option<(String, Option)>), + Vote(String), + ForceVote(String), + Save(String, String), + Delete(String, String), + SaveRoom(String), + LoadRoom(String), } + +pub fn number + + std::default::Default + + std::ops::MulAssign + + std::ops::AddAssign> + (digits: Vec) -> T { + let mut value: T = T::default(); + for digit in digits { + value *= T::from(10); + value += T::from(digit); + } + value +} diff -r 6273f89ab13d -r a4d22f197bd2 gameServer2/src/protocol/mod.rs --- a/gameServer2/src/protocol/mod.rs Thu Jan 05 19:07:01 2017 +0300 +++ b/gameServer2/src/protocol/mod.rs Fri Jan 06 01:00:21 2017 +0300 @@ -4,6 +4,7 @@ mod messages; mod hwprotocol; +mod lexer; pub struct FrameDecoder { buf: netbuf::Buf, @@ -24,3 +25,9 @@ &self.buf[..] } } + +#[test] +fn testparser() { + assert_eq!(messages::HWProtocolMessage::Nick("hey".to_string()), + hwprotocol::parse_ProtocolMessage("NICK\nhey\n\n").unwrap()); +} diff -r 6273f89ab13d -r a4d22f197bd2 gameServer2/src/server/coretypes.rs --- a/gameServer2/src/server/coretypes.rs Thu Jan 05 19:07:01 2017 +0300 +++ b/gameServer2/src/server/coretypes.rs Fri Jan 06 01:00:21 2017 +0300 @@ -1,13 +1,16 @@ +#[derive(PartialEq, Debug)] pub enum ServerVar { MOTDNew(String), MOTDOld(String), LatestProto(u32), } +#[derive(PartialEq, Debug)] pub enum GameCfg { } +#[derive(PartialEq, Debug)] pub struct TeamInfo { name: String, color: u8, @@ -20,6 +23,7 @@ hedgehogs: [HedgehogInfo; 8], } +#[derive(PartialEq, Debug)] pub struct HedgehogInfo { name: String, hat: String,