#![no_std] #![cfg_attr(docsrs, feature(doc_cfg))]
#![doc = include_str!("../README.md")]
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(any(test, feature = "std"))]
extern crate std;
use shogi_core::{Color, Hand, Move, PartialPosition, Piece, Square};
macro_rules! bind {
($e:expr) => {
match $e {
Ok(x) => x,
Err(e) => return Err(e),
}
};
}
macro_rules! try_with_progress {
($e:expr, $shift:expr) => {
match $e {
Ok(x) => x,
Err(Error::InvalidInput {
from,
to,
description,
}) => {
return Err(Error::InvalidInput {
from: from + $shift,
to: to + $shift,
description,
});
}
Err(e) => return Err(e),
}
};
}
mod color;
mod common;
mod error;
mod hand;
mod mv;
mod piece;
mod position;
mod square;
pub trait FromUsi: private::Sealed + Sized {
#[doc(hidden)]
fn parse_usi_slice(s: &[u8]) -> Result<(&[u8], Self)>;
fn from_usi(s: &str) -> Result<Self> {
let s = s.as_bytes();
let (remaining, value) = bind!(Self::parse_usi_slice(s));
if remaining.is_empty() {
return Ok(value);
}
Err(Error::Extra {
from: s.len() - remaining.len(),
})
}
#[inline]
fn from_usi_lite(s: &str) -> Option<Self> {
match Self::from_usi(s) {
Ok(value) => Some(value),
Err(_) => None,
}
}
}
#[doc(inline)]
pub use crate::error::{Error, Result};
pub mod c_func {
#[doc(inline)]
pub use crate::hand::Hand_parse_usi_slice;
#[doc(inline)]
pub use crate::position::PartialPosition_parse_usi_slice;
#[cfg(feature = "alloc")]
#[doc(inline)]
pub use crate::position::Position_parse_usi_slice;
}
mod private {
use super::*;
pub trait Sealed {}
impl Sealed for Color {}
impl Sealed for Square {}
impl Sealed for Piece {}
impl Sealed for Move {}
impl Sealed for [Hand; 2] {}
impl Sealed for PartialPosition {}
#[cfg(feature = "alloc")]
impl Sealed for shogi_core::Position {}
}