From 703c11515de72f2432df4d9b79d49e0157d026d0 Mon Sep 17 00:00:00 2001 From: daywalker90 <8257956+daywalker90@users.noreply.github.com> Date: Sat, 9 Nov 2024 16:46:21 +0100 Subject: [PATCH] msggen: add support for short_channel_id_dir and pubkey Changelog-None --- cln-rpc/src/primitives.rs | 54 +++++++++++++++++++++ contrib/msggen/msggen/gen/grpc/convert.py | 4 ++ contrib/msggen/msggen/gen/grpc/unconvert.py | 4 ++ contrib/msggen/msggen/gen/grpc/util.py | 1 + contrib/msggen/msggen/gen/grpc2py.py | 1 + contrib/msggen/msggen/gen/rpc/rust.py | 1 + 6 files changed, 65 insertions(+) diff --git a/cln-rpc/src/primitives.rs b/cln-rpc/src/primitives.rs index 0d05c3aa2..645bf058f 100644 --- a/cln-rpc/src/primitives.rs +++ b/cln-rpc/src/primitives.rs @@ -267,6 +267,60 @@ impl ShortChannelId { } } +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct ShortChannelIdDir { + pub short_channel_id: ShortChannelId, + pub direction: u32, +} +impl Serialize for ShortChannelIdDir { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} + +impl<'de> Deserialize<'de> for ShortChannelIdDir { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + use serde::de::Error; + let s: String = Deserialize::deserialize(deserializer)?; + Ok(Self::from_str(&s).map_err(|e| Error::custom(e.to_string()))?) + } +} +impl FromStr for ShortChannelIdDir { + type Err = crate::Error; + fn from_str(s: &str) -> Result { + let parts: Result, _> = s.split('/').map(|p| p.parse()).collect(); + let parts = parts.with_context(|| format!("Malformed short_channel_id_dir: {}", s))?; + if parts.len() != 2 { + return Err(anyhow!( + "Malformed short_channel_id_dir: element count mismatch" + )); + } + + Ok(ShortChannelIdDir { + short_channel_id: ShortChannelId::from_str(&parts[0])?, + direction: parts[1].parse::()?, + }) + } +} +impl Display for ShortChannelIdDir { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}x{}x{}/{}", + self.short_channel_id.block(), + self.short_channel_id.txindex(), + self.short_channel_id.outnum(), + self.direction + ) + } +} + #[derive(Clone, Copy, Debug)] pub struct Secret([u8; 32]); diff --git a/contrib/msggen/msggen/gen/grpc/convert.py b/contrib/msggen/msggen/gen/grpc/convert.py index 19bc9c76f..a6e045424 100644 --- a/contrib/msggen/msggen/gen/grpc/convert.py +++ b/contrib/msggen/msggen/gen/grpc/convert.py @@ -69,6 +69,8 @@ class GrpcConverterGenerator(IGenerator): "secret": f"i.to_vec()", "hash": f">::as_ref(&i).to_vec()", "short_channel_id": f"i.to_string()", + "short_channel_id_dir": f"i.to_string()", + "pubkey": f"i.serialize().to_vec()", }.get(typ, f"i.into()") self.write(f"// Field: {f.path}\n", numindent=3) @@ -110,6 +112,8 @@ class GrpcConverterGenerator(IGenerator): "txid?": f"c.{name}.map(|v| hex::decode(v).unwrap())", "short_channel_id": f"c.{name}.to_string()", "short_channel_id?": f"c.{name}.map(|v| v.to_string())", + "short_channel_id_dir": f"c.{name}.to_string()", + "short_channel_id_dir?": f"c.{name}.map(|v| v.to_string())", "hash": f">::as_ref(&c.{name}).to_vec()", "hash?": f"c.{name}.map(|v| >::as_ref(&v).to_vec())", "secret": f"c.{name}.to_vec()", diff --git a/contrib/msggen/msggen/gen/grpc/unconvert.py b/contrib/msggen/msggen/gen/grpc/unconvert.py index e996d2c87..974139b60 100644 --- a/contrib/msggen/msggen/gen/grpc/unconvert.py +++ b/contrib/msggen/msggen/gen/grpc/unconvert.py @@ -54,6 +54,8 @@ class GrpcUnconverterGenerator(GrpcConverterGenerator): "secret": f"s.try_into().unwrap()", "hash": f"Sha256::from_slice(&s).unwrap()", "short_channel_id": f"cln_rpc::primitives::ShortChannelId::from_str(&s).unwrap()", + "short_channel_id_dir": f"cln_rpc::primitives::ShortChannelIdDir::from_str(&s).unwrap()", + "pubkey": f"PublicKey::from_slice(&s).unwrap()", }.get(typ, f"s.into()") # TODO fix properly @@ -121,6 +123,8 @@ class GrpcUnconverterGenerator(GrpcConverterGenerator): "DecodeRoutehintList?": f"c.{name}.map(|drl| drl.into())", "short_channel_id": f"cln_rpc::primitives::ShortChannelId::from_str(&c.{name}).unwrap()", "short_channel_id?": f"c.{name}.map(|v| cln_rpc::primitives::ShortChannelId::from_str(&v).unwrap())", + "short_channel_id_dir": f"cln_rpc::primitives::ShortChannelIdDir::from_str(&c.{name}).unwrap()", + "short_channel_id_dir?": f"c.{name}.map(|v| cln_rpc::primitives::ShortChannelIdDir::from_str(&v).unwrap())", "secret": f"c.{name}.try_into().unwrap()", "secret?": f"c.{name}.map(|v| v.try_into().unwrap())", "hash": f"Sha256::from_slice(&c.{name}).unwrap()", diff --git a/contrib/msggen/msggen/gen/grpc/util.py b/contrib/msggen/msggen/gen/grpc/util.py index 21ec56714..2682d96b9 100644 --- a/contrib/msggen/msggen/gen/grpc/util.py +++ b/contrib/msggen/msggen/gen/grpc/util.py @@ -15,6 +15,7 @@ typemap = { "number": "double", "pubkey": "bytes", "short_channel_id": "string", + "short_channel_id_dir": "string", "signature": "string", "string": "string", "txid": "bytes", diff --git a/contrib/msggen/msggen/gen/grpc2py.py b/contrib/msggen/msggen/gen/grpc2py.py index fd8b508db..a23f7cd1c 100644 --- a/contrib/msggen/msggen/gen/grpc2py.py +++ b/contrib/msggen/msggen/gen/grpc2py.py @@ -53,6 +53,7 @@ class Grpc2PyGenerator(IGenerator): "integer": "m.{name}", "boolean": "m.{name}", "short_channel_id": "m.{name}", + "short_channel_id_dir": "m.{name}", "msat": "amount2msat(m.{name})", "sat": "amount2sat(m.{name})", "currency": "m.{name}", diff --git a/contrib/msggen/msggen/gen/rpc/rust.py b/contrib/msggen/msggen/gen/rpc/rust.py index 924ea8ccd..dd6d83b3e 100644 --- a/contrib/msggen/msggen/gen/rpc/rust.py +++ b/contrib/msggen/msggen/gen/rpc/rust.py @@ -33,6 +33,7 @@ typemap = { "number": "f64", "pubkey": "PublicKey", "short_channel_id": "ShortChannelId", + "short_channel_id_dir": "ShortChannelIdDir", "signature": "String", "string": "String", "txid": "String",