md-cli 0.5.0

CLI for the Mnemonic Descriptor (MD) engravable BIP 388 wallet policy backup format
use crate::error::CliError;
use md_codec::chunk::reassemble;
use md_codec::decode::decode_md1_string;
use md_codec::encode::encode_payload;

pub fn run(strings: &[String], json: bool) -> Result<(), CliError> {
    let descriptor = if strings.len() == 1 {
        decode_md1_string(&strings[0])?
    } else {
        let refs: Vec<&str> = strings.iter().map(String::as_str).collect();
        reassemble(&refs)?
    };
    let (bytes, bit_len) = encode_payload(&descriptor)?;

    #[cfg(feature = "json")]
    if json {
        use crate::format::json::SCHEMA;
        let mut hex = String::with_capacity(bytes.len() * 2);
        for b in &bytes {
            use std::fmt::Write as _;
            write!(hex, "{b:02x}").unwrap();
        }
        let v = serde_json::json!({
            "schema": SCHEMA,
            "payload_bits": bit_len,
            "payload_bytes": bytes.len(),
            "hex": hex,
        });
        println!("{}", serde_json::to_string_pretty(&v).unwrap());
        return Ok(());
    }
    let _ = json;

    println!("payload-bits: {bit_len}");
    println!("payload-bytes: {}", bytes.len());
    print!("hex: ");
    for b in &bytes {
        print!("{b:02x}");
    }
    println!();
    Ok(())
}