annotate python/src/lib.rs @ 778:816e1f01d650

Partially replace the Loader with a Rust one
author Link Mauve <linkmauve@linkmauve.fr>
date Sat, 08 Nov 2025 18:26:01 +0100
parents 28d8b892fd06
children ee09657d3789
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
1 use pyo3::exceptions::PyIOError;
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2 use pyo3::prelude::*;
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 use pyo3::types::PyBytes;
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4 use touhou_formats::th06::pbg3;
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
5 use std::collections::HashMap;
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
6 use std::fs::File;
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
7 use std::io::BufReader;
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
8 use std::path::PathBuf;
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
9
772
7492d384d122 Rust: Add a Glide renderer (2D only for now)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 770
diff changeset
10 #[cfg(feature = "glide")]
7492d384d122 Rust: Add a Glide renderer (2D only for now)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 770
diff changeset
11 mod glide;
7492d384d122 Rust: Add a Glide renderer (2D only for now)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 770
diff changeset
12
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
13 #[pyclass(module = "libtouhou")]
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
14 struct PBG3 {
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
15 filename: PathBuf,
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
16 inner: pbg3::PBG3<BufReader<File>>,
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
17 }
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
18
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
19 impl PBG3 {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
20 fn get_file_internal(&mut self, name: &str) -> Vec<u8> {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
21 self.inner.get_file(name, true).unwrap()
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
22 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
23 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
24
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
25 #[pymethods]
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
26 impl PBG3 {
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
27 #[staticmethod]
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
28 fn from_filename(filename: PathBuf) -> PyResult<PBG3> {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
29 let inner = pbg3::from_path_buffered(&filename)?;
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
30 Ok(PBG3 {
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
31 filename,
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
32 inner
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
33 })
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
34 }
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
35
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
36 fn __repr__(&self) -> String {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
37 format!("PBG3({})", self.filename.to_str().unwrap())
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
38 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
39
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
40 #[getter]
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
41 fn file_list(&self) -> Vec<String> {
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
42 self.inner.list_files().cloned().collect()
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
43 }
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
44
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
45 fn list_files(&self) -> Vec<String> {
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
46 self.inner.list_files().cloned().collect()
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
47 }
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
48
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
49 fn get_file(&mut self, py: Python, name: &str) -> Py<PyBytes> {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
50 let data = self.get_file_internal(name);
775
28d8b892fd06 Python: Upgrade pyo3 from 0.17 to 0.26
Link Mauve <linkmauve@linkmauve.fr>
parents: 772
diff changeset
51 PyBytes::new(py, &data).into()
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
52 }
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
53 }
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
54
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
55 /// A loader for Touhou files.
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
56 #[pyclass(module = "libtouhou", get_all, subclass)]
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
57 #[derive(Default)]
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
58 struct Loader {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
59 /// The file names to the possible executable.
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
60 exe_files: Vec<PathBuf>,
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
61
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
62 /// The path to the game directory.
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
63 game_dir: Option<PathBuf>,
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
64
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
65 /// A map from inner filenames to the archive containing them.
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
66 known_files: HashMap<String, Py<PBG3>>,
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
67 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
68
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
69 #[pymethods]
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
70 impl Loader {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
71 /// Create a new Loader for the given game_dir.
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
72 #[new]
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
73 fn new(game_dir: Option<PathBuf>) -> Loader {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
74 Loader {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
75 exe_files: Vec::new(),
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
76 game_dir,
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
77 known_files: HashMap::new(),
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
78 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
79 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
80
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
81 /// Scan the game_dir for archives.
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
82 ///
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
83 /// paths_lists is a list of ':'-separated glob patterns, the first matching file will be used
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
84 /// and the other ones ignored.
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
85 fn scan_archives(&mut self, py: Python, paths_lists: Vec<String>) -> PyResult<()> {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
86 for paths in paths_lists.iter() {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
87 let found_paths: Vec<_> = paths.split(':').map(|path| {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
88 glob::glob(if let Some(game_dir) = self.game_dir.as_ref() {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
89 game_dir.join(path)
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
90 } else {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
91 PathBuf::from(path)
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
92 }.to_str().unwrap()).unwrap()
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
93 }).flatten().map(Result::unwrap).map(PathBuf::from).collect();
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
94 if found_paths.is_empty() {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
95 return Err(PyIOError::new_err(format!("No path found for {paths:?}")));
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
96 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
97 let path = &found_paths[0];
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
98 if let Some(extension) = path.extension() && extension == "exe" {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
99 self.exe_files.extend(found_paths);
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
100 } else {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
101 let pbg3 = PBG3::from_filename(path.to_owned())?;
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
102 let filenames = pbg3.list_files();
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
103 let pbg3 = Py::new(py, pbg3)?;
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
104 for name in filenames {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
105 self.known_files.insert(name.clone(), Py::clone_ref(&pbg3, py));
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
106 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
107 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
108 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
109 Ok(())
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
110 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
111
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
112 /// Return the given file as an io.BytesIO object.
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
113 fn get_file(&self, py: Python, name: String) -> PyResult<Py<PyAny>> {
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
114 let archive = self.known_files.get(&name).unwrap();
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
115 let mut archive = archive.borrow_mut(py);
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
116 let bytes = archive.get_file(py, &name);
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
117 let io = py.import("io")?;
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
118 let bytesio_class = io.dict().get_item("BytesIO")?.unwrap();
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
119 let file = bytesio_class.call1((bytes,))?;
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
120 Ok(file.unbind())
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
121 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
122 }
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
123
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
124 #[pymodule]
775
28d8b892fd06 Python: Upgrade pyo3 from 0.17 to 0.26
Link Mauve <linkmauve@linkmauve.fr>
parents: 772
diff changeset
125 mod libtouhou {
28d8b892fd06 Python: Upgrade pyo3 from 0.17 to 0.26
Link Mauve <linkmauve@linkmauve.fr>
parents: 772
diff changeset
126 #[pymodule_export]
778
816e1f01d650 Partially replace the Loader with a Rust one
Link Mauve <linkmauve@linkmauve.fr>
parents: 775
diff changeset
127 use super::Loader;
775
28d8b892fd06 Python: Upgrade pyo3 from 0.17 to 0.26
Link Mauve <linkmauve@linkmauve.fr>
parents: 772
diff changeset
128
772
7492d384d122 Rust: Add a Glide renderer (2D only for now)
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 770
diff changeset
129 #[cfg(feature = "glide")]
775
28d8b892fd06 Python: Upgrade pyo3 from 0.17 to 0.26
Link Mauve <linkmauve@linkmauve.fr>
parents: 772
diff changeset
130 #[pymodule_export]
28d8b892fd06 Python: Upgrade pyo3 from 0.17 to 0.26
Link Mauve <linkmauve@linkmauve.fr>
parents: 772
diff changeset
131 use super::glide::module;
770
f6c287745a67 Rust: Add a libtouhou Python wrapper using pyo3
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
132 }