use clap::Parser;
use env_logger::Env;
use psvm::{
get_orml_crates_and_version, get_polkadot_sdk_versions, get_release_branches_versions,
get_version_mapping_with_fallback, include_orml_crates_in_version_mapping, update_dependencies,
validate_workspace_path, Repository, DEFAULT_GIT_SERVER,
};
use std::collections::BTreeMap;
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(about, author)]
struct Command {
#[clap(short, long, default_value = "Cargo.toml")]
path: PathBuf,
#[clap(short, long, required_unless_present = "list")]
version: Option<String>,
#[clap(short, long)]
overwrite: bool,
#[clap(short, long)]
list: bool,
#[clap(short, long)]
check: bool,
#[clap(short('O'), long)]
orml: bool,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
let cmd = Command::parse();
if cmd.list {
let crates_versions = if cmd.orml {
get_release_branches_versions(Repository::Orml).await?
} else {
get_polkadot_sdk_versions().await?
};
println!("Available versions:");
for version in crates_versions.iter() {
println!("- {}", version);
}
return Ok(());
}
let version = cmd.version.unwrap();
let cargo_toml_path = validate_workspace_path(cmd.path)?;
let mut crates_versions: BTreeMap<String, String> =
get_version_mapping_with_fallback(DEFAULT_GIT_SERVER, &version).await?;
if cmd.orml {
let orml_crates = get_orml_crates_and_version(DEFAULT_GIT_SERVER, &version).await?;
include_orml_crates_in_version_mapping(&mut crates_versions, orml_crates);
}
update_dependencies(&cargo_toml_path, &crates_versions, cmd.overwrite, cmd.check)?;
Ok(())
}