@@ -33,6 +33,50 @@ impl<R: Read> BufferedReader<R> {
3333 }
3434 }
3535
36+ /// Converts a [`Read`] value along with the internal [`Buffer`] to a [`BufferedReader`].
37+ ///
38+ /// Since [`Buffer`] is private, you can only use use this to create a [`BufferedReader`]
39+ /// from [`BufferedReader::into_inner`].
40+ ///
41+ /// # Examples
42+ ///
43+ /// ```rust
44+ /// # use std::io::Cursor;
45+ /// # use shakmaty::san::SanPlus;
46+ /// # use pgn_reader::{BufferedReader, Visitor};
47+ /// let mut reader = BufferedReader::new(Cursor::new("1. e4 e5\n\n1. d4"));
48+ /// reader.skip_game().unwrap();
49+ /// let inner = reader.into_inner();
50+ /// // do something with inner
51+ /// let (buffer, r) = inner.into_inner();
52+ /// reader = BufferedReader::from_buffer(buffer.into_inner(), r);
53+ ///
54+ /// #[derive(Default)]
55+ /// struct LastMove(Option<SanPlus>);
56+ ///
57+ /// impl Visitor for LastMove {
58+ /// type Result = Option<SanPlus>;
59+ ///
60+ /// fn san(&mut self, san_plus: SanPlus) {
61+ /// self.0 = Some(san_plus);
62+ /// }
63+ ///
64+ /// fn end_game(&mut self) -> Self::Result {
65+ /// std::mem::replace(&mut self.0, None)
66+ /// }
67+ /// }
68+ ///
69+ /// assert_eq!(reader.read_game(&mut LastMove::default()).unwrap().unwrap(), Some(SanPlus::from_ascii(b"d4").unwrap()));
70+ /// ```
71+ pub fn from_buffer ( buffer : Buffer , reader : R ) -> BufferedReader < R > {
72+ BufferedReader {
73+ reader,
74+ buffer,
75+ max_tag_line_length : 1024 ,
76+ max_comment_length : 4096 ,
77+ }
78+ }
79+
3680 fn skip_bom ( & mut self ) -> io:: Result < ( ) > {
3781 if self
3882 . buffer
0 commit comments