# HG changeset patch # User Emmanuel Gil Peyrot # Date 1661876635 -7200 # Node ID f6c287745a67596376d0da873402b75dee28a844 # Parent cae5f15ca5edbff38a0030a1d26a89ca27652963 Rust: Add a libtouhou Python wrapper using pyo3 diff --git a/Cargo.toml b/Cargo.toml --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ members = [ "formats", "interpreters", + "python", "runners", "utils", ] @@ -10,5 +11,6 @@ members = [ [patch.crates-io] touhou-formats = { path = "formats" } touhou-interpreters = { path = "interpreters" } +touhou-python = { path = "python" } touhou-runners = { path = "runners" } touhou-utils = { path = "utils" } diff --git a/python/Cargo.toml b/python/Cargo.toml new file mode 100644 --- /dev/null +++ b/python/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "touhou-python" +version = "0.1.0" +edition = "2021" +authors = [ + "Emmanuel Gil Peyrot ", +] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib"] +name = "touhou" + +[dependencies] +touhou-formats = "*" +pyo3 = "0.17" diff --git a/python/src/lib.rs b/python/src/lib.rs new file mode 100644 --- /dev/null +++ b/python/src/lib.rs @@ -0,0 +1,41 @@ +use pyo3::prelude::*; +use pyo3::types::PyBytes; +use touhou_formats::th06::pbg3; +use std::fs::File; +use std::io::BufReader; + +#[pyclass] +struct PBG3 { + inner: pbg3::PBG3>, +} + +#[pymethods] +impl PBG3 { + #[staticmethod] + fn from_filename(filename: &str) -> PyResult { + let inner = pbg3::from_path_buffered(filename)?; + Ok(PBG3 { + inner + }) + } + + #[getter] + fn file_list(&self) -> Vec { + self.inner.list_files().cloned().collect() + } + + fn list_files(&self) -> Vec { + self.inner.list_files().cloned().collect() + } + + fn get_file(&mut self, py: Python, name: &str) -> PyObject { + let data = self.inner.get_file(name, true).unwrap(); + PyBytes::new(py, &data).into_py(py) + } +} + +#[pymodule] +fn libtouhou(_py: Python, m: &PyModule) -> PyResult<()> { + m.add_class::()?; + Ok(()) +}