cargo_component/commands/
bindings.rs

1use anyhow::Result;
2use cargo_component_core::command::CommonOptions;
3use clap::Args;
4
5use crate::{
6    config::Config, generate_bindings, load_component_metadata, load_metadata, CargoArguments,
7};
8
9/// Just update the generated bindings.
10///
11/// The generated bindings are generated automatically by subcommands like
12/// `cargo component build`; `cargo component bindings` is for when one wishes
13/// to just generate the bindings without doing any other work.
14#[derive(Args)]
15#[clap(disable_version_flag = true)]
16pub struct BindingsCommand {
17    /// The common command options.
18    #[clap(flatten)]
19    pub common: CommonOptions,
20}
21
22impl BindingsCommand {
23    /// Executes the command.
24    pub async fn exec(self) -> Result<()> {
25        log::debug!("generating bindings");
26
27        let config = Config::new(self.common.new_terminal(), self.common.config.clone()).await?;
28
29        let client = config.client(self.common.cache_dir.clone(), false).await?;
30
31        let cargo_args = CargoArguments::parse()?;
32        let metadata = load_metadata(None)?;
33        let packages =
34            load_component_metadata(&metadata, cargo_args.packages.iter(), cargo_args.workspace)?;
35        let _import_name_map =
36            generate_bindings(client, &config, &metadata, &packages, &cargo_args).await?;
37
38        Ok(())
39    }
40}