From 65c1aea408ec24f87eaf3e07d834616be456eece Mon Sep 17 00:00:00 2001 From: ok300 <106775972+ok300@users.noreply.github.com> Date: Sat, 7 Sep 2024 23:23:35 +0200 Subject: [PATCH] CLI decode_token: use CBOR diagnostic format instead of pure JSON This brings decoded TokenV4s in line with the format specified in NUT-00, especially around how byte array fields are handled. --- crates/cdk-cli/src/sub_commands/decode_token.rs | 3 ++- crates/cdk/Cargo.toml | 1 + crates/cdk/src/util/mod.rs | 12 ++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/crates/cdk-cli/src/sub_commands/decode_token.rs b/crates/cdk-cli/src/sub_commands/decode_token.rs index ff2c8c90..9781205d 100644 --- a/crates/cdk-cli/src/sub_commands/decode_token.rs +++ b/crates/cdk-cli/src/sub_commands/decode_token.rs @@ -2,6 +2,7 @@ use std::str::FromStr; use anyhow::Result; use cdk::nuts::Token; +use cdk::util::serialize_to_cbor_diag; use clap::Args; #[derive(Args)] @@ -13,6 +14,6 @@ pub struct DecodeTokenSubCommand { pub fn decode_token(sub_command_args: &DecodeTokenSubCommand) -> Result<()> { let token = Token::from_str(&sub_command_args.token)?; - println!("{:}", serde_json::to_string_pretty(&token)?); + println!("{:}", serialize_to_cbor_diag(&token)?); Ok(()) } diff --git a/crates/cdk/Cargo.toml b/crates/cdk/Cargo.toml index a4e8f800..b5654cf8 100644 --- a/crates/cdk/Cargo.toml +++ b/crates/cdk/Cargo.toml @@ -27,6 +27,7 @@ bitcoin = { version= "0.30", features = [ "rand-std", ] } # lightning-invoice uses v0.30 ciborium = { version = "0.2.2", default-features = false, features = ["std"] } +cbor-diag = "0.1.12" lightning-invoice = { version = "0.31", features = ["serde"] } once_cell = "1.19" regex = "1" diff --git a/crates/cdk/src/util/mod.rs b/crates/cdk/src/util/mod.rs index 5da77547..485562ae 100644 --- a/crates/cdk/src/util/mod.rs +++ b/crates/cdk/src/util/mod.rs @@ -3,6 +3,7 @@ #[cfg(not(target_arch = "wasm32"))] use std::time::{SystemTime, UNIX_EPOCH}; +use anyhow::Result; use bitcoin::secp256k1::{rand, All, Secp256k1}; #[cfg(target_arch = "wasm32")] use instant::SystemTime; @@ -28,3 +29,14 @@ pub fn unix_time() -> u64 { .unwrap_or_default() .as_secs() } + +/// Serializes a struct to the CBOR diagnostic notation. +/// +/// See +pub fn serialize_to_cbor_diag(data: &T) -> Result { + let mut cbor_buffer = Vec::new(); + ciborium::ser::into_writer(data, &mut cbor_buffer)?; + + let diag = cbor_diag::parse_bytes(&cbor_buffer)?; + Ok(diag.to_diag_pretty()) +}