1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
// This file is part of the pgn-reader library. // Copyright (C) 2017-2018 Niklas Fiekas <niklas.fiekas@backscattering.de> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. use shakmaty::Outcome; use shakmaty::san::SanPlus; use crate::types::{RawComment, RawHeader, Nag, Skip}; /// Consumes games from a reader. /// ///  pub trait Visitor { /// Value produced by the visitor after reading a game. type Result; /// Called at the start of the game. fn begin_game(&mut self) { } /// Called directly before reading game headers. fn begin_headers(&mut self) { } /// Called when parsing a game header like `[White "Deep Blue"]`. fn header(&mut self, _key: &[u8], _value: RawHeader<'_>) { } /// Called after reading the headers of a game. May skip quickly over /// the following move text directly to /// [`end_game()`](trait.Visitor.html#tymethod.end_game). fn end_headers(&mut self) -> Skip { Skip(false) } /// Called for each move, like `Nf3+`. fn san(&mut self, _san_plus: SanPlus) { } /// Called for each numeric annotation glyph like `!?` or `$7`. fn nag(&mut self, _nag: Nag) { } /// Called for each `{ comment }`. fn comment(&mut self, _comment: RawComment<'_>) { } /// Called for each `(`. May skip over the following variation directly /// to [`end_variation()`](trait.Visitor.html#method.end_variation) (or to /// [`end_game()`](trait.Visitor.html#tymethod.end_game) if no matching `)` /// follows before the end of the game. fn begin_variation(&mut self) -> Skip { Skip(false) } /// Called for each `)`. It is *not* guaranteed that there was a /// matching `(`. fn end_variation(&mut self) { } /// Called for each game termination, like `*` or `1-0`. fn outcome(&mut self, _outcome: Option<Outcome>) { } /// Called after parsing a game. Can produce a custom result. fn end_game(&mut self) -> Self::Result; } pub(crate) struct SkipVisitor; impl Visitor for SkipVisitor { type Result = (); fn end_headers(&mut self) -> Skip { Skip(true) } fn begin_variation(&mut self) -> Skip { Skip(true) } fn end_game(&mut self) { } }