cargo_release/steps/
config.rs1use 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#[derive(Debug, Clone, clap::Args)]
11pub struct ConfigStep {
12 #[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 .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}