soroban_cli/commands/contract/alias/
add.rs1use std::fmt::Debug;
2
3use clap::Parser;
4
5use crate::commands::{config::network, global};
6use crate::config::{address::AliasName, locator};
7use crate::print::Print;
8
9#[derive(Parser, Debug, Clone)]
10#[group(skip)]
11pub struct Cmd {
12 #[command(flatten)]
13 pub config_locator: locator::Args,
14
15 #[command(flatten)]
16 pub network: network::Args,
17
18 pub alias: AliasName,
20
21 #[arg(long)]
23 pub overwrite: bool,
24
25 #[arg(long = "id")]
27 pub contract_id: stellar_strkey::Contract,
28}
29
30#[derive(thiserror::Error, Debug)]
31pub enum Error {
32 #[error(transparent)]
33 Locator(#[from] locator::Error),
34
35 #[error(transparent)]
36 Network(#[from] network::Error),
37
38 #[error(
39 "alias '{alias}' is already referencing contract '{contract}' on network '{network_passphrase}'"
40 )]
41 AlreadyExist {
42 alias: String,
43 network_passphrase: String,
44 contract: stellar_strkey::Contract,
45 },
46}
47
48impl Cmd {
49 pub fn run(&self, global_args: &global::Args) -> Result<(), Error> {
50 let print = Print::new(global_args.quiet);
51 let alias = &self.alias;
52
53 crate::config::alias::validate_reserved_aliases(alias)?;
54
55 let network = self.network.get(&self.config_locator)?;
56 let network_passphrase = &network.network_passphrase;
57
58 let contract = self
59 .config_locator
60 .get_contract_id(&self.alias, network_passphrase)?;
61
62 if let Some(contract) = contract {
63 if contract != self.contract_id && !self.overwrite {
64 return Err(Error::AlreadyExist {
65 alias: alias.to_string(),
66 network_passphrase: network_passphrase.clone(),
67 contract,
68 });
69 }
70 }
71
72 print.infoln(format!(
73 "Contract alias '{alias}' will reference {contract} on network '{network_passphrase}'",
74 contract = self.contract_id
75 ));
76
77 self.config_locator.save_contract_id(
78 &network.network_passphrase,
79 &self.contract_id,
80 alias,
81 )?;
82
83 print.checkln(format!("Contract alias '{alias}' has been added"));
84
85 Ok(())
86 }
87}