cargo_release/steps/
config.rs

1use std::io::Write;
2
3use crate::config::Config;
4use crate::config::ConfigArgs;
5use crate::config::load_package_config;
6use crate::config::load_workspace_config;
7use crate::error::CliError;
8
9/// Dump workspace configuration
10#[derive(Debug, Clone, clap::Args)]
11pub struct ConfigStep {
12    /// Write the current configuration to file with `-` for stdout
13    #[arg(short, long, default_value = "-")]
14    output: std::path::PathBuf,
15
16    #[command(flatten)]
17    manifest: clap_cargo::Manifest,
18
19    #[command(flatten)]
20    config: ConfigArgs,
21}
22
23impl ConfigStep {
24    pub fn run(&self) -> Result<(), CliError> {
25        log::trace!("initializing");
26        let ws_meta = self
27            .manifest
28            .metadata()
29            // When evaluating dependency ordering, we need to consider optional depednencies
30            .features(cargo_metadata::CargoOpt::AllFeatures)
31            .exec()?;
32
33        let release_config =
34            if let Some(root_id) = ws_meta.resolve.as_ref().and_then(|r| r.root.as_ref()) {
35                let pkg = ws_meta
36                    .packages
37                    .iter()
38                    .find(|p| p.id == *root_id)
39                    .expect("root should always be present");
40
41                let mut release_config = Config::from_defaults();
42                release_config.update(&load_package_config(&self.config, &ws_meta, pkg)?);
43                release_config
44            } else {
45                let mut release_config = Config::from_defaults();
46                release_config.update(&load_workspace_config(&self.config, &ws_meta)?);
47                release_config
48            };
49
50        let output = toml::to_string_pretty(&release_config)?;
51
52        if self.output == std::path::Path::new("-") {
53            std::io::stdout().write_all(output.as_bytes())?;
54        } else {
55            std::fs::write(&self.output, &output)?;
56        }
57
58        Ok(())
59    }
60}