1use anyhow::anyhow;
2use fuel_crypto::fuel_types::Address;
3use fuels_core::types::bech32::Bech32Address;
4use serde_json::json;
5use std::str::{from_utf8, FromStr};
6
7forc_util::cli_examples! {
8 crate::Command {
9 [ Convert an address to another format => "forc crypto address fuel12e0xwx34nfp7jrzvn9mp5qkac3yvp7h8fx37ghl7klf82vv2wkys6wd523" ]
10 }
11}
12
13#[derive(Debug, clap::Args)]
14#[clap(
15 version,
16 about = "Converts an address to another format",
17 after_help = help(),
18)]
19pub struct Args {
20 pub address: String,
23}
24
25pub fn dump_address<T: AsRef<[u8]>>(data: T) -> anyhow::Result<serde_json::Value> {
29 let bytes_32: Result<[u8; 32], _> = data.as_ref().try_into();
30 let (bech32, addr) = match bytes_32 {
31 Ok(bytes) => (
32 Bech32Address::from(Address::from(bytes)),
33 Address::from(bytes),
34 ),
35 Err(_) => handle_string_conversion(data)?,
36 };
37
38 Ok(json!({
39 "Bench32": bech32.to_string(),
40 "Address": addr.to_string(),
41 }))
42}
43
44fn handle_string_conversion<T: AsRef<[u8]>>(data: T) -> anyhow::Result<(Bech32Address, Address)> {
45 let addr = from_utf8(data.as_ref())?;
46 if let Ok(bech32) = Bech32Address::from_str(addr) {
47 Ok((bech32.clone(), Address::from(bech32)))
48 } else if let Ok(addr) = Address::from_str(addr) {
49 Ok((Bech32Address::from(addr), addr))
50 } else {
51 Err(anyhow!("{} cannot be parsed to a valid address", addr))
52 }
53}