monorepo/sgf/src/lib.rs

99 lines
2.4 KiB
Rust
Raw Normal View History

mod date;
mod game;
mod parser;
mod types;
2023-06-22 14:04:52 +00:00
use std::{fs::File, io::Read};
pub use date::Date;
pub use game::Game;
pub use parser::parse_collection;
2023-06-22 14:04:52 +00:00
use thiserror::Error;
pub use types::*;
2023-07-26 23:33:50 +00:00
#[derive(Debug)]
pub enum Error {
2023-07-26 23:33:50 +00:00
InvalidField,
InvalidBoardSize,
Incomplete,
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)),
}
}
2023-07-26 23:33:50 +00:00
}
2023-06-22 14:04:52 +00:00
#[derive(Debug, PartialEq, Error)]
pub enum ParseError {
#[error("An unknown error was found")]
NomError(nom::error::Error<String>),
2023-06-22 14:04:52 +00:00
}
2023-06-23 03:58:16 +00:00
impl From<nom::error::Error<&str>> for ParseError {
fn from(err: nom::error::Error<&str>) -> Self {
Self::NomError(nom::error::Error {
input: err.input.to_owned(),
2023-10-05 15:41:00 +00:00
code: err.code,
})
2023-06-23 03:58:16 +00:00
}
}
pub fn parse_sgf(input: &str) -> Result<Vec<Result<Game, game::GameError>>, Error> {
let (_, games) = parse_collection::<nom::error::VerboseError<&str>>(&input)?;
let games = games.into_iter()
.map(|game| Game::try_from(&game))
.collect::<Vec<Result<Game, game::GameError>>>();
Ok(games)
}
pub fn parse_sgf_file(path: &std::path::Path) -> Result<Vec<Result<Game, game::GameError>>, Error> {
let mut file = File::open(path).unwrap();
let mut text = String::new();
let _ = file.read_to_string(&mut text);
parse_sgf(&text)
}
/*
pub fn parse_sgf(_input: &str) -> Result<Vec<Game>, Error> {
Ok(vec![Game::new(
GameType::Go,
Size {
width: 19,
height: 19,
},
Player {
name: None,
rank: None,
team: None,
},
Player {
name: None,
rank: None,
team: None,
},
)])
}
*/