Set up a per-game interpretation layer atop the SGF, and bind all games together in a Game
data structure #49
|
@ -70,30 +70,15 @@
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
date::{self, parse_date_field, Date},
|
date::{self, parse_date_field, Date},
|
||||||
tree::{parse_collection, ParseSizeError, Size},
|
tree::{parse_collection, Size},
|
||||||
Error,
|
Error, VerboseNomError,
|
||||||
};
|
};
|
||||||
|
use nom::error::VerboseError;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use typeshare::typeshare;
|
use typeshare::typeshare;
|
||||||
|
|
||||||
pub struct Game {}
|
pub struct Game {}
|
||||||
|
|
||||||
impl<'a> From<nom::Err<nom::error::VerboseError<&'a str>>> for Error<'a> {
|
|
||||||
fn from(err: nom::Err<nom::error::VerboseError<&'a str>>) -> Self {
|
|
||||||
match err {
|
|
||||||
nom::Err::Incomplete(_) => Error::Incomplete,
|
|
||||||
nom::Err::Error(e) => Error::InvalidSgf(e.clone()),
|
|
||||||
nom::Err::Failure(e) => Error::InvalidSgf(e.clone()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> From<ParseSizeError> for Error<'a> {
|
|
||||||
fn from(_: ParseSizeError) -> Self {
|
|
||||||
Self::InvalidBoardSize
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
#[typeshare]
|
#[typeshare]
|
||||||
pub enum Rank {
|
pub enum Rank {
|
||||||
|
@ -236,8 +221,8 @@ enum PropValue {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pub fn parse_sgf<'a>(input: &'a str) -> Result<Vec<GameTree>, Error<'a>> {
|
pub fn parse_sgf(input: &str) -> Result<Vec<GameTree>, Error> {
|
||||||
let (_, trees) = parse_collection::<nom::error::VerboseError<&'a str>>(input)?;
|
let (_, trees) = parse_collection::<nom::error::VerboseError<&str>>(input)?;
|
||||||
|
|
||||||
let games = trees
|
let games = trees
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
|
|
@ -10,11 +10,36 @@ use tree::parse_collection;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum Error<'a> {
|
pub enum Error {
|
||||||
InvalidField,
|
InvalidField,
|
||||||
InvalidBoardSize,
|
InvalidBoardSize,
|
||||||
Incomplete,
|
Incomplete,
|
||||||
InvalidSgf(nom::error::VerboseError<&'a str>),
|
InvalidSgf(VerboseNomError),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct VerboseNomError(nom::error::VerboseError<String>);
|
||||||
|
|
||||||
|
impl From<nom::error::VerboseError<&str>> for VerboseNomError {
|
||||||
|
fn from(err: nom::error::VerboseError<&str>) -> Self {
|
||||||
|
VerboseNomError(nom::error::VerboseError {
|
||||||
|
errors: err
|
||||||
|
.errors
|
||||||
|
.into_iter()
|
||||||
|
.map(|err| (err.0.to_owned(), err.1))
|
||||||
|
.collect(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<nom::Err<nom::error::VerboseError<&str>>> for Error {
|
||||||
|
fn from(err: nom::Err<nom::error::VerboseError<&str>>) -> Self {
|
||||||
|
match err {
|
||||||
|
nom::Err::Incomplete(_) => Error::Incomplete,
|
||||||
|
nom::Err::Error(e) => Error::InvalidSgf(VerboseNomError::from(e)),
|
||||||
|
nom::Err::Failure(e) => Error::InvalidSgf(VerboseNomError::from(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Error)]
|
#[derive(Debug, PartialEq, Error)]
|
||||||
|
@ -37,8 +62,8 @@ pub enum Game {
|
||||||
Unsupported(tree::Tree),
|
Unsupported(tree::Tree),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_sgf<'a>(input: &'a str) -> Result<Vec<Game>, Error<'a>> {
|
pub fn parse_sgf(input: &str) -> Result<Vec<Game>, Error> {
|
||||||
let (_, trees) = parse_collection::<nom::error::VerboseError<&'a str>>(input)?;
|
let (_, trees) = parse_collection::<nom::error::VerboseError<&str>>(input)?;
|
||||||
Ok(trees
|
Ok(trees
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|t| match t.sequence[0].find_prop("GM") {
|
.map(|t| match t.sequence[0].find_prop("GM") {
|
||||||
|
|
|
@ -10,6 +10,12 @@ use nom::{
|
||||||
};
|
};
|
||||||
use std::num::ParseIntError;
|
use std::num::ParseIntError;
|
||||||
|
|
||||||
|
impl From<ParseSizeError> for Error {
|
||||||
|
fn from(_: ParseSizeError) -> Self {
|
||||||
|
Self::InvalidBoardSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum ParseSizeError {
|
pub enum ParseSizeError {
|
||||||
ParseIntError(ParseIntError),
|
ParseIntError(ParseIntError),
|
||||||
|
|
Loading…
Reference in New Issue