use {
bitcoin::{consensus::Decodable, Transaction},
clap::{
builder::{
styling::{AnsiColor, Effects},
Styles,
},
Parser,
},
runestone::Runestone,
std::{error::Error, io},
};
#[derive(Parser)]
#[command(
version,
styles = Styles::styled()
.header(AnsiColor::Green.on_default() | Effects::BOLD)
.usage(AnsiColor::Green.on_default() | Effects::BOLD)
.literal(AnsiColor::Blue.on_default() | Effects::BOLD)
.placeholder(AnsiColor::Cyan.on_default()))
]
enum Subcommand {
#[command(
about = "Read a bitcoin transaction from standard input and print a JSON representation of its Rune message."
)]
Decipher,
}
fn main() -> Result<(), Box<dyn Error>> {
match Subcommand::parse() {
Subcommand::Decipher => {
let transaction = Transaction::consensus_decode(&mut io::stdin())
.map_err(|err| format!("Failed to decode transaction: {err}"))?;
let message = Runestone::decipher(&transaction)?;
serde_json::to_writer_pretty(&io::stdout(), &message)?;
}
}
Ok(())
}