wasmer_pack_cli/
codegen.rs

1use std::path::PathBuf;
2
3use crate::Error;
4use anyhow::Context;
5use clap::Parser;
6
7#[derive(Debug, Parser)]
8pub struct Codegen {
9    /// Where to save the generated bindings.
10    #[clap(short, long)]
11    pub out_dir: Option<PathBuf>,
12    /// The Pirita file to read.
13    pub input: PathBuf,
14}
15
16impl Codegen {
17    pub fn run(self, language: Language) -> Result<(), Error> {
18        let Codegen { out_dir, input } = self;
19
20        let pkg = crate::pirita::load_from_disk(&input)
21            .with_context(|| format!("Unable to load the package from \"{}\"", input.display()))?;
22
23        let files = match language {
24            Language::JavaScript => wasmer_pack::generate_javascript(&pkg)?,
25            Language::Python => wasmer_pack::generate_python(&pkg)?,
26        };
27
28        let metadata = pkg.metadata();
29
30        let out_dir = out_dir.unwrap_or_else(|| {
31            // If no output directory was specified, let's save to something
32            // like "namespace/name/"
33            let pkg_name = &metadata.package_name;
34            match pkg_name.namespace().as_str() {
35                Some(ns) => PathBuf::from(ns).join(pkg_name.name()),
36                None => PathBuf::from(pkg_name.name()),
37            }
38        });
39        files
40            .save_to_disk(&out_dir)
41            .with_context(|| format!("Unable to save to \"{}\"", out_dir.display()))?;
42
43        Ok(())
44    }
45}
46
47#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
48pub enum Language {
49    JavaScript,
50    Python,
51}
52
53impl Language {
54    pub fn name(self) -> &'static str {
55        match self {
56            Language::JavaScript => "JavaScript",
57            Language::Python => "Python",
58        }
59    }
60}