postcard_bindgen/package/
pip_module.rs1use core::borrow::Borrow;
2use std::{
3 fs::{create_dir_all, File},
4 io::{self, Write},
5 path::Path,
6};
7
8use postcard_bindgen_core::{
9 code_gen::python::{generate, GenerationSettings},
10 registry::ContainerCollection,
11};
12
13use super::{PackageInfo, Version};
14
15pub fn build_pip_module(
16 parent_dir: &Path,
17 package_info: PackageInfo,
18 gen_settings: impl Borrow<GenerationSettings>,
19 containers: ContainerCollection,
20) -> io::Result<()> {
21 let mut dir = parent_dir.to_path_buf();
22 dir.push(package_info.name.as_str());
23 std::fs::create_dir_all(&dir)?;
24
25 let package_name = package_info.name.replace("-", "_");
26
27 let mod_toml = mod_file_src(&package_name, &package_info.version);
28
29 let mut mod_toml_path = dir.to_owned();
30 mod_toml_path.push("pyproject.toml");
31 File::create(mod_toml_path.as_path())?.write_all(mod_toml.as_bytes())?;
32
33 dir.push("src");
34 dir.push(&package_name);
35
36 std::fs::create_dir_all(&dir)?;
37
38 let exports = generate(containers, gen_settings, package_info.name);
39
40 let bindings_export_path = dir.to_owned();
41
42 for file in exports.files {
43 let path = bindings_export_path.join(format!("{}.py", file.content_type));
44 let dir_path = {
45 let mut p = path.clone();
46 p.pop();
47 p
48 };
49 create_dir_all(dir_path)?;
50 File::create(path.as_path())?
51 .write_all(file.content.to_file_string().unwrap().as_bytes())?;
52 }
53
54 Ok(())
55}
56
57fn mod_file_src(package_name: impl AsRef<str>, package_version: &Version) -> String {
58 let package_name = package_name.as_ref();
59 let package_version = package_version.to_string();
60
61 format!(
62 "
63[project]
64name = \"{package_name}\"
65version = \"{package_version}\"
66authors = [
67 {{ name=\"postcard-bindgen\" }},
68]
69description = \"Auto generated bindings for postcard format serializing and deserializing python to and from bytes.\"
70requires-python = \">=3.8\"
71",
72 )
73}