cln-grpc: Map AmountOrAll and AmountOrAny

This commit is contained in:
Christian Decker
2022-04-01 14:42:45 +10:30
committed by Rusty Russell
parent 04e7e285d7
commit bba68e2136
12 changed files with 90 additions and 10 deletions

View File

@@ -558,7 +558,7 @@ message DelinvoiceResponse {
} }
message InvoiceRequest { message InvoiceRequest {
Amount msatoshi = 1; AmountOrAny msatoshi = 1;
string description = 2; string description = 2;
string label = 3; string label = 3;
repeated string fallbacks = 4; repeated string fallbacks = 4;
@@ -910,7 +910,7 @@ message NewaddrResponse {
message WithdrawRequest { message WithdrawRequest {
bytes destination = 1; bytes destination = 1;
optional Amount satoshi = 2; optional AmountOrAll satoshi = 2;
optional Feerate feerate = 5; optional Feerate feerate = 5;
optional uint32 minconf = 3; optional uint32 minconf = 3;
repeated Utxo utxos = 4; repeated Utxo utxos = 4;

View File

@@ -5,6 +5,20 @@ message Amount {
uint64 msat = 1; uint64 msat = 1;
} }
message AmountOrAll {
oneof value {
Amount amount = 1;
bool all = 2;
}
}
message AmountOrAny {
oneof value {
Amount amount = 1;
bool any = 2;
}
}
enum ChannelSide { enum ChannelSide {
IN = 0; IN = 0;
OUT = 1; OUT = 1;

View File

@@ -1028,7 +1028,7 @@ impl From<&pb::DelinvoiceRequest> for requests::DelinvoiceRequest {
impl From<&pb::InvoiceRequest> for requests::InvoiceRequest { impl From<&pb::InvoiceRequest> for requests::InvoiceRequest {
fn from(c: &pb::InvoiceRequest) -> Self { fn from(c: &pb::InvoiceRequest) -> Self {
Self { Self {
msatoshi: c.msatoshi.as_ref().unwrap().into(), // Rule #1 for type msat msatoshi: c.msatoshi.as_ref().unwrap().into(), // Rule #1 for type msat|any
description: c.description.clone(), // Rule #1 for type string description: c.description.clone(), // Rule #1 for type string
label: c.label.clone(), // Rule #1 for type string label: c.label.clone(), // Rule #1 for type string
fallbacks: c.fallbacks.iter().map(|s| s.into()).collect(), fallbacks: c.fallbacks.iter().map(|s| s.into()).collect(),
@@ -1156,7 +1156,7 @@ impl From<&pb::WithdrawRequest> for requests::WithdrawRequest {
fn from(c: &pb::WithdrawRequest) -> Self { fn from(c: &pb::WithdrawRequest) -> Self {
Self { Self {
destination: hex::encode(&c.destination), // Rule #1 for type pubkey destination: hex::encode(&c.destination), // Rule #1 for type pubkey
satoshi: c.satoshi.as_ref().map(|a| a.into()), // Rule #1 for type msat? satoshi: c.satoshi.as_ref().map(|a| a.into()), // Rule #1 for type msat|all?
feerate: c.feerate.as_ref().map(|a| a.into()), // Rule #1 for type feerate? feerate: c.feerate.as_ref().map(|a| a.into()), // Rule #1 for type feerate?
minconf: c.minconf.map(|v| v as u16), // Rule #1 for type u16? minconf: c.minconf.map(|v| v as u16), // Rule #1 for type u16?
utxos: c.utxos.iter().map(|s| s.into()).collect(), utxos: c.utxos.iter().map(|s| s.into()).collect(),

View File

@@ -1,7 +1,8 @@
tonic::include_proto!("cln"); tonic::include_proto!("cln");
use cln_rpc::primitives::{ use cln_rpc::primitives::{
Amount as JAmount, Feerate as JFeerate, OutputDesc as JOutputDesc, Utxo as JUtxo, Amount as JAmount, AmountOrAll as JAmountOrAll, AmountOrAny as JAmountOrAny,
Feerate as JFeerate, OutputDesc as JOutputDesc, Utxo as JUtxo,
}; };
impl From<JAmount> for Amount { impl From<JAmount> for Amount {
@@ -55,3 +56,48 @@ impl From<&OutputDesc> for JOutputDesc {
} }
} }
} }
impl From<JAmountOrAll> for AmountOrAll {
fn from(a: JAmountOrAll) -> Self {
match a {
JAmountOrAll::Amount(a) => AmountOrAll {
value: Some(amount_or_all::Value::Amount(a.into())),
},
JAmountOrAll::All => AmountOrAll {
value: Some(amount_or_all::Value::All(true)),
},
}
}
}
impl From<&AmountOrAll> for JAmountOrAll {
fn from(a: &AmountOrAll) -> Self {
match &a.value {
Some(amount_or_all::Value::Amount(a)) => JAmountOrAll::Amount(a.into()),
Some(amount_or_all::Value::All(_)) => JAmountOrAll::All,
None => panic!("AmountOrAll is neither amount nor all: {:?}", a),
}
}
}
impl From<JAmountOrAny> for AmountOrAny {
fn from(a: JAmountOrAny) -> Self {
match a {
JAmountOrAny::Amount(a) => AmountOrAny {
value: Some(amount_or_any::Value::Amount(a.into())),
},
JAmountOrAny::Any => AmountOrAny {
value: Some(amount_or_any::Value::Any(true)),
},
}
}
}
impl From<&AmountOrAny> for JAmountOrAny {
fn from(a: &AmountOrAny) -> Self {
match &a.value {
Some(amount_or_any::Value::Amount(a)) => JAmountOrAny::Amount(a.into()),
Some(amount_or_any::Value::Any(_)) => JAmountOrAny::Any,
None => panic!("AmountOrAll is neither amount nor any: {:?}", a),
}
}
}

View File

@@ -75,7 +75,7 @@ impl ClnRpc {
// serde_json knows which variant of [`Request`] should be // serde_json knows which variant of [`Request`] should be
// used. // used.
response["method"] = req2["method"].clone(); response["method"] = req2["method"].clone();
log::warn!("XXX {:?}", response);
serde_json::from_value(response).context("converting response into enum") serde_json::from_value(response).context("converting response into enum")
} }
} }

View File

@@ -321,7 +321,7 @@ pub mod requests {
#[derive(Clone, Debug, Deserialize, Serialize)] #[derive(Clone, Debug, Deserialize, Serialize)]
pub struct InvoiceRequest { pub struct InvoiceRequest {
#[serde(alias = "msatoshi")] #[serde(alias = "msatoshi")]
pub msatoshi: Amount, pub msatoshi: AmountOrAny,
#[serde(alias = "description")] #[serde(alias = "description")]
pub description: String, pub description: String,
#[serde(alias = "label")] #[serde(alias = "label")]
@@ -477,7 +477,7 @@ pub mod requests {
#[serde(alias = "destination")] #[serde(alias = "destination")]
pub destination: String, pub destination: String,
#[serde(alias = "satoshi", skip_serializing_if = "Option::is_none")] #[serde(alias = "satoshi", skip_serializing_if = "Option::is_none")]
pub satoshi: Option<Amount>, pub satoshi: Option<AmountOrAll>,
#[serde(alias = "feerate", skip_serializing_if = "Option::is_none")] #[serde(alias = "feerate", skip_serializing_if = "Option::is_none")]
pub feerate: Option<Feerate>, pub feerate: Option<Feerate>,
#[serde(alias = "minconf", skip_serializing_if = "Option::is_none")] #[serde(alias = "minconf", skip_serializing_if = "Option::is_none")]

View File

@@ -10,6 +10,8 @@ typemap = {
'boolean': 'bool', 'boolean': 'bool',
'hex': 'bytes', 'hex': 'bytes',
'msat': 'Amount', 'msat': 'Amount',
'msat|all': 'AmountOrAll',
'msat|any': 'AmountOrAny',
'number': 'sint64', 'number': 'sint64',
'pubkey': 'bytes', 'pubkey': 'bytes',
'short_channel_id': 'string', 'short_channel_id': 'string',
@@ -395,6 +397,10 @@ class GrpcUnconverterGenerator(GrpcConverterGenerator):
'pubkey?': f'c.{name}.clone().map(|v| hex::encode(v))', 'pubkey?': f'c.{name}.clone().map(|v| hex::encode(v))',
'msat': f'c.{name}.as_ref().unwrap().into()', 'msat': f'c.{name}.as_ref().unwrap().into()',
'msat?': f'c.{name}.as_ref().map(|a| a.into())', 'msat?': f'c.{name}.as_ref().map(|a| a.into())',
'msat|all': f'c.{name}.as_ref().unwrap().into()',
'msat|all?': f'c.{name}.as_ref().map(|a| a.into())',
'msat|any': f'c.{name}.as_ref().unwrap().into()',
'msat|any?': f'c.{name}.as_ref().map(|a| a.into())',
'feerate': f'c.{name}.as_ref().unwrap().into()', 'feerate': f'c.{name}.as_ref().unwrap().into()',
'feerate?': f'c.{name}.as_ref().map(|a| a.into())', 'feerate?': f'c.{name}.as_ref().map(|a| a.into())',
}.get( }.get(

View File

@@ -224,6 +224,8 @@ class PrimitiveField(Field):
"pubkey", "pubkey",
"signature", "signature",
"msat", "msat",
"msat|any",
"msat|all",
"hex", "hex",
"short_channel_id", "short_channel_id",
"txid", "txid",

View File

@@ -32,6 +32,8 @@ typemap = {
'boolean': 'bool', 'boolean': 'bool',
'hex': 'String', 'hex': 'String',
'msat': 'Amount', 'msat': 'Amount',
'msat|all': 'AmountOrAll',
'msat|any': 'AmountOrAny',
'number': 'i64', 'number': 'i64',
'pubkey': 'String', 'pubkey': 'String',
'short_channel_id': 'String', 'short_channel_id': 'String',

View File

@@ -9,7 +9,7 @@
], ],
"properties": { "properties": {
"msatoshi": { "msatoshi": {
"type": "msat", "type": "msat|any",
"description": "" "description": ""
}, },
"description": { "description": {

View File

@@ -9,7 +9,7 @@
"type": "pubkey" "type": "pubkey"
}, },
"satoshi": { "satoshi": {
"type": "msat" "type": "msat|all"
}, },
"feerate": { "feerate": {
"type": "feerate" "type": "feerate"

View File

@@ -5,6 +5,7 @@ from pyln.testing.utils import env, TEST_NETWORK, wait_for
from ephemeral_port_reserve import reserve from ephemeral_port_reserve import reserve
import grpc import grpc
import node_pb2 as nodepb import node_pb2 as nodepb
from primitives_pb2 import AmountOrAny
import pytest import pytest
import subprocess import subprocess
@@ -101,6 +102,15 @@ def test_grpc_connect(node_factory):
response = stub.ListFunds(nodepb.ListfundsRequest()) response = stub.ListFunds(nodepb.ListfundsRequest())
print(response) print(response)
inv = stub.Invoice(nodepb.InvoiceRequest(
msatoshi=AmountOrAny(any=True),
description="hello",
label="lbl1",
preimage=b"\x00" * 32,
cltv=24
))
print(inv)
def test_grpc_generate_certificate(node_factory): def test_grpc_generate_certificate(node_factory):
"""Test whether we correctly generate the certificates. """Test whether we correctly generate the certificates.