Skip to main content

postcard_bindgen/package/
pip_module.rs

1use 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}