ruci/gui/
mod.rs

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    /// A message sent from the GUI to the engine.
13    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        /// Tells the engine to use UCI.
26        Uci,
27        /// Asks the engine if it is ready.
28        ///
29        /// Once ready, engine replies with [`ReadyOk`](crate::ReadyOk).
30        IsReady,
31        /// Tells the engine to start a new game with the next [`Position`](crate::Position) or [`Go`](crate::Go).
32        UciNewGame,
33        /// Tells the engine to stop calculating.
34        Stop,
35        PonderHit,
36        /// Tells the engine to stop everything.
37        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}