1dry_mods::mods! {
2 mod pub use go, register, set_option, position, debug;
3}
4
5use crate::dev_macros::define_message;
6use crate::errors::MessageParseError;
7use crate::parsing;
8use core::str::FromStr;
9use pointers::MessagePointer;
10
11define_message! {
12 enum Gui {
14 =[custom]
15 Debug(Debug),
16 %[parameters = [Name, Value]]
17 SetOption(SetOption<'a>),
18 %[parameters = [Name, Code]]
19 Register(Register<'a>),
20 %[parameters = [Fen, Moves, StartPos]]
21 Position(Position<'a>),
22 %[parameters = [SearchMoves, Ponder, WTime, BTime, WInc, BInc, MovesToGo, Depth, Nodes, Mate, MoveTime, Infinite]]
23 Go(Go<'a>)
24 =[empty]
25 Uci,
27 IsReady,
31 UciNewGame,
33 Stop,
35 PonderHit,
36 Quit
38 }
39}
40
41impl FromStr for Message<'_> {
42 type Err = MessageParseError;
43
44 fn from_str(s: &str) -> Result<Self, Self::Err> {
45 let (message_pointer, parts) =
46 parsing::collect_any_message::<MessagePointer>("GUI UCI message", s)?;
47
48 match message_pointer {
49 MessagePointer::Debug => Ok(Debug::from_str_parts_message_assumed(parts)?.into()),
50 MessagePointer::SetOption => {
51 Ok(SetOption::from_str_parts_message_assumed(parts)?.into())
52 }
53 MessagePointer::Register => Ok(Register::from_str_parts_message_assumed(parts)?.into()),
54 MessagePointer::Position => Ok(Position::from_str_parts_message_assumed(parts)?.into()),
55 MessagePointer::Go => Ok(Go::from_str_parts_message_assumed(parts).into()),
56 MessagePointer::Uci => Ok(Uci.into()),
57 MessagePointer::IsReady => Ok(IsReady.into()),
58 MessagePointer::UciNewGame => Ok(UciNewGame.into()),
59 MessagePointer::Stop => Ok(Stop.into()),
60 MessagePointer::PonderHit => Ok(PonderHit.into()),
61 MessagePointer::Quit => Ok(Quit.into()),
62 }
63 }
64}