From e7d89cd7de65ec543c8ae9889550eaa30220a614 Mon Sep 17 00:00:00 2001 From: ZmnSCPxj jxPCSnmZ Date: Sun, 19 Jul 2020 17:04:03 +0800 Subject: [PATCH] lightningd/invoice.c: Improve programmatic error reporting for `delinvoice`. Changelog-Changed: JSON-RPC: `delinvoice` will now report specific error codes: 905 for failing to find the invoice, 906 for the invoice status not matching the parameter. --- common/jsonrpc_errors.h | 4 +++- doc/lightning-delinvoice.7 | 15 +++++++++++++++ doc/lightning-delinvoice.7.md | 13 +++++++++++++ lightningd/invoice.c | 15 +++++++++++---- 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/common/jsonrpc_errors.h b/common/jsonrpc_errors.h index 35d5cab3de64..64a3aa4b4f36 100644 --- a/common/jsonrpc_errors.h +++ b/common/jsonrpc_errors.h @@ -59,12 +59,14 @@ static const errcode_t CONNECT_ALL_ADDRESSES_FAILED = 401; /* bitcoin-cli plugin errors */ #define BCLI_ERROR 400 -/* Errors from `invoice` command */ +/* Errors from `invoice` or `delinvoice` commands */ static const errcode_t INVOICE_LABEL_ALREADY_EXISTS = 900; static const errcode_t INVOICE_PREIMAGE_ALREADY_EXISTS = 901; static const errcode_t INVOICE_HINTS_GAVE_NO_ROUTES = 902; static const errcode_t INVOICE_EXPIRED_DURING_WAIT = 903; static const errcode_t INVOICE_WAIT_TIMED_OUT = 904; +static const errcode_t INVOICE_NOT_FOUND = 905; +static const errcode_t INVOICE_STATUS_UNEXPECTED = 906; /* Errors from HSM crypto operations. */ static const errcode_t HSM_ECDH_FAILED = 800; diff --git a/doc/lightning-delinvoice.7 b/doc/lightning-delinvoice.7 index fd6a7ea64bb5..1049150f68a7 100644 --- a/doc/lightning-delinvoice.7 +++ b/doc/lightning-delinvoice.7 @@ -19,6 +19,21 @@ The caller should be particularly aware of the error case caused by the On success, an invoice description will be returned as per \fBlightning-listinvoice\fR(7)\. +.SH ERRORS + +The following errors may be reported: + +.RS +.IP \[bu] +-1: Database error\. +.IP \[bu] +905: An invoice with that label does not exist\. +.IP \[bu] +906: The invoice \fIstatus\fR does not match the parameter\. +An error object will be returned as error \fIdata\fR, containing +\fIcurrent_status\fR and \fIexpected_status\fR fields\. + +.RE .SH AUTHOR Rusty Russell \fI is mainly responsible\. diff --git a/doc/lightning-delinvoice.7.md b/doc/lightning-delinvoice.7.md index 791b2966ac92..907847d560a8 100644 --- a/doc/lightning-delinvoice.7.md +++ b/doc/lightning-delinvoice.7.md @@ -21,6 +21,19 @@ RETURN VALUE On success, an invoice description will be returned as per lightning-listinvoice(7). +ERRORS +------ + +The following errors may be reported: + +- -1: Database error. +- 905: An invoice with that label does not exist. +- 906: The invoice *status* does not match the parameter. + An error object will be returned as error *data*, containing + *current_status* and *expected_status* fields. + This is most likely due to the *status* of the invoice + changing just before this command is invoked. + AUTHOR ------ diff --git a/lightningd/invoice.c b/lightningd/invoice.c index 87ef0e31d196..08fb5dbfc005 100644 --- a/lightningd/invoice.c +++ b/lightningd/invoice.c @@ -1145,7 +1145,7 @@ static struct command_result *json_delinvoice(struct command *cmd, return command_param_failed(); if (!wallet_invoice_find_by_label(wallet, &i, label)) { - return command_fail(cmd, LIGHTNINGD, "Unknown invoice"); + return command_fail(cmd, INVOICE_NOT_FOUND, "Unknown invoice"); } details = wallet_invoice_details(cmd, cmd->ld->wallet, i); @@ -1154,15 +1154,22 @@ static struct command_result *json_delinvoice(struct command *cmd, * might not make sense if it changed! */ actual_status = invoice_status_str(details); if (!streq(actual_status, status)) { - return command_fail(cmd, LIGHTNINGD, - "Invoice status is %s not %s", - actual_status, status); + struct json_stream *js; + js = json_stream_fail(cmd, INVOICE_STATUS_UNEXPECTED, + tal_fmt(tmpctx, + "Invoice status is %s not %s", + actual_status, status)); + json_add_string(js, "current_status", actual_status); + json_add_string(js, "expected_status", status); + json_object_end(js); + return command_failed(cmd, js); } if (!wallet_invoice_delete(wallet, i)) { log_broken(cmd->ld->log, "Error attempting to remove invoice %"PRIu64, i.id); + /* FIXME: allocate a generic DATABASE_ERROR code. */ return command_fail(cmd, LIGHTNINGD, "Database error"); }