use pyo3::prelude::*;
use crate::openings::{self, Opening};
use super::board::PyPosition;
#[pyclass(
frozen,
eq,
hash,
from_py_object,
module = "esca.openings",
name = "Opening"
)]
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct PyOpening {
inner: Opening,
}
impl PyOpening {
pub(crate) fn new(inner: Opening) -> PyOpening {
PyOpening { inner }
}
}
#[pymethods]
impl PyOpening {
#[getter]
fn eco(&self) -> &'static str {
self.inner.eco
}
#[getter]
fn name(&self) -> &'static str {
self.inner.name
}
fn __str__(&self) -> String {
self.inner.to_string()
}
fn __repr__(&self) -> String {
format!("<Opening {}>", self.inner)
}
}
#[pyfunction]
pub(crate) fn openings_lookup(position: &PyPosition) -> Option<PyOpening> {
openings::lookup(&position.inner).map(PyOpening::new)
}
#[pyfunction]
pub(crate) fn openings_count() -> usize {
openings::count()
}
pub(crate) fn register(module: &Bound<'_, PyModule>) -> PyResult<()> {
module.add_class::<PyOpening>()?;
module.add_function(wrap_pyfunction!(openings_lookup, module)?)?;
module.add_function(wrap_pyfunction!(openings_count, module)?)?;
Ok(())
}