mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-02-21 14:24:09 +01:00
libplugin: use json_stream for all plugins' commands
This commit is contained in:
parent
2bff80e3de
commit
b91433cb42
2 changed files with 79 additions and 97 deletions
|
@ -87,17 +87,15 @@ static struct command_result *finish(struct command *cmd,
|
|||
const jsmntok_t *result,
|
||||
struct funding_req *fr)
|
||||
{
|
||||
struct json_out *out;
|
||||
struct json_stream *out;
|
||||
|
||||
out = json_out_new(NULL);
|
||||
json_out_start(out, NULL, '{');
|
||||
copy_member(out, buf, result, "tx");
|
||||
json_out_addstr(out, "txid",
|
||||
out = jsonrpc_stream_success(cmd);
|
||||
json_add_tok(out, "tx", json_get_member(buf, result, "tx"), buf);
|
||||
json_add_string(out, "txid",
|
||||
type_to_string(tmpctx, struct bitcoin_txid, &fr->tx_id));
|
||||
json_out_addstr(out, "channel_id", fr->chanstr);
|
||||
json_out_end(out, '}');
|
||||
json_add_string(out, "channel_id", fr->chanstr);
|
||||
|
||||
return command_success(cmd, out);
|
||||
return command_finished(cmd, out);
|
||||
}
|
||||
|
||||
/* We're ready to broadcast the transaction */
|
||||
|
|
162
plugins/pay.c
162
plugins/pay.c
|
@ -198,14 +198,6 @@ static void attempt_failed_tok(struct pay_command *pc, const char *method,
|
|||
failed_end(failed);
|
||||
}
|
||||
|
||||
/* Helper to add a u64. */
|
||||
static void json_out_add_u64(struct json_out *jout,
|
||||
const char *fieldname,
|
||||
u64 val)
|
||||
{
|
||||
json_out_add(jout, fieldname, false, "%"PRIu64, val);
|
||||
}
|
||||
|
||||
static struct command_result *start_pay_attempt(struct command *cmd,
|
||||
struct pay_command *pc,
|
||||
const char *fmt, ...);
|
||||
|
@ -255,26 +247,26 @@ static struct command_result *waitsendpay_expired(struct command *cmd,
|
|||
struct pay_command *pc)
|
||||
{
|
||||
char *errmsg;
|
||||
struct json_out *data;
|
||||
struct json_stream *data;
|
||||
size_t num_attempts = count_sendpays(pc->ps->attempts);
|
||||
|
||||
errmsg = tal_fmt(pc, "Gave up after %zu attempt%s: see paystatus",
|
||||
num_attempts, num_attempts == 1 ? "" : "s");
|
||||
data = json_out_new(NULL);
|
||||
json_out_start(data, NULL, '{');
|
||||
json_out_start(data, "attempts", '[');
|
||||
data = jsonrpc_stream_fail(cmd, PAY_STOPPED_RETRYING, errmsg);
|
||||
json_object_start(data, "data");
|
||||
json_array_start(data, "attempts");
|
||||
for (size_t i = 0; i < tal_count(pc->ps->attempts); i++) {
|
||||
json_out_start(data, NULL, '{');
|
||||
json_object_start(data, NULL);
|
||||
if (pc->ps->attempts[i].route)
|
||||
json_out_add_raw(data, "route",
|
||||
json_add_member(data, "route", false, "%s",
|
||||
pc->ps->attempts[i].route);
|
||||
json_out_add_splice(data, "failure",
|
||||
json_out_add_splice(data->jout, "failure",
|
||||
pc->ps->attempts[i].failure);
|
||||
json_out_end(data, '}');
|
||||
json_object_end(data);
|
||||
}
|
||||
json_out_end(data, ']');
|
||||
json_out_end(data, '}');
|
||||
return command_done_err(cmd, PAY_STOPPED_RETRYING, errmsg, data);
|
||||
json_array_end(data);
|
||||
json_object_end(data);
|
||||
return command_finished(cmd, data);
|
||||
}
|
||||
|
||||
static bool routehint_excluded(struct plugin *plugin,
|
||||
|
@ -1363,7 +1355,7 @@ static void utc_timestring(const struct timeabs *time, char str[UTC_TIMELEN])
|
|||
(int) time->ts.tv_nsec / 1000000);
|
||||
}
|
||||
|
||||
static void add_attempt(struct json_out *ret,
|
||||
static void add_attempt(struct json_stream *ret,
|
||||
const struct pay_status *ps,
|
||||
const struct pay_attempt *attempt)
|
||||
{
|
||||
|
@ -1371,56 +1363,56 @@ static void add_attempt(struct json_out *ret,
|
|||
|
||||
utc_timestring(&attempt->start, timestr);
|
||||
|
||||
json_out_start(ret, NULL, '{');
|
||||
json_out_addstr(ret, "strategy", attempt->why);
|
||||
json_out_addstr(ret, "start_time", timestr);
|
||||
json_out_add_u64(ret, "age_in_seconds",
|
||||
json_object_start(ret, NULL);
|
||||
json_add_string(ret, "strategy", attempt->why);
|
||||
json_add_string(ret, "start_time", timestr);
|
||||
json_add_u64(ret, "age_in_seconds",
|
||||
time_to_sec(time_between(time_now(), attempt->start)));
|
||||
if (attempt->result || attempt->failure) {
|
||||
utc_timestring(&attempt->end, timestr);
|
||||
json_out_addstr(ret, "end_time", timestr);
|
||||
json_out_add_u64(ret, "duration_in_seconds",
|
||||
time_to_sec(time_between(attempt->end,
|
||||
attempt->start)));
|
||||
json_add_string(ret, "end_time", timestr);
|
||||
json_add_u64(ret, "duration_in_seconds",
|
||||
time_to_sec(time_between(attempt->end,
|
||||
attempt->start)));
|
||||
}
|
||||
if (tal_count(attempt->routehint)) {
|
||||
json_out_start(ret, "routehint", '[');
|
||||
json_array_start(ret, "routehint");
|
||||
for (size_t i = 0; i < tal_count(attempt->routehint); i++) {
|
||||
json_out_start(ret, NULL, '{');
|
||||
json_out_addstr(ret, "id",
|
||||
json_object_start(ret, NULL);
|
||||
json_add_string(ret, "id",
|
||||
type_to_string(tmpctx, struct node_id,
|
||||
&attempt->routehint[i].pubkey));
|
||||
json_out_addstr(ret, "channel",
|
||||
json_add_string(ret, "channel",
|
||||
type_to_string(tmpctx,
|
||||
struct short_channel_id,
|
||||
&attempt->routehint[i].short_channel_id));
|
||||
json_out_add_u64(ret, "fee_base_msat",
|
||||
attempt->routehint[i].fee_base_msat);
|
||||
json_out_add_u64(ret, "fee_proportional_millionths",
|
||||
attempt->routehint[i].fee_proportional_millionths);
|
||||
json_out_add_u64(ret, "cltv_expiry_delta",
|
||||
attempt->routehint[i].cltv_expiry_delta);
|
||||
json_out_end(ret, '}');
|
||||
json_add_u64(ret, "fee_base_msat",
|
||||
attempt->routehint[i].fee_base_msat);
|
||||
json_add_u64(ret, "fee_proportional_millionths",
|
||||
attempt->routehint[i].fee_proportional_millionths);
|
||||
json_add_u64(ret, "cltv_expiry_delta",
|
||||
attempt->routehint[i].cltv_expiry_delta);
|
||||
json_object_end(ret);
|
||||
}
|
||||
json_out_end(ret, ']');
|
||||
json_array_end(ret);
|
||||
}
|
||||
if (tal_count(attempt->excludes)) {
|
||||
json_out_start(ret, "excluded_nodes_or_channels", '[');
|
||||
json_array_start(ret, "excluded_nodes_or_channels");
|
||||
for (size_t i = 0; i < tal_count(attempt->excludes); i++)
|
||||
json_out_addstr(ret, NULL, attempt->excludes[i]);
|
||||
json_out_end(ret, ']');
|
||||
json_add_string(ret, NULL, attempt->excludes[i]);
|
||||
json_array_end(ret);
|
||||
}
|
||||
|
||||
if (attempt->route)
|
||||
json_out_add_raw(ret, "route", attempt->route);
|
||||
json_add_member(ret, "route", true, "%s", attempt->route);
|
||||
|
||||
if (attempt->failure)
|
||||
json_out_add_splice(ret, "failure", attempt->failure);
|
||||
json_out_add_splice(ret->jout, "failure", attempt->failure);
|
||||
|
||||
if (attempt->result)
|
||||
json_out_add_raw(ret, "success", attempt->result);
|
||||
json_add_member(ret, "success", true, "%s", attempt->result);
|
||||
|
||||
json_out_end(ret, '}');
|
||||
json_object_end(ret);
|
||||
}
|
||||
|
||||
static struct command_result *json_paystatus(struct command *cmd,
|
||||
|
@ -1429,51 +1421,49 @@ static struct command_result *json_paystatus(struct command *cmd,
|
|||
{
|
||||
struct pay_status *ps;
|
||||
const char *b11str;
|
||||
struct json_out *ret;
|
||||
struct json_stream *ret;
|
||||
|
||||
if (!param(cmd, buf, params,
|
||||
p_opt("bolt11", param_string, &b11str),
|
||||
NULL))
|
||||
return command_param_failed();
|
||||
|
||||
ret = json_out_new(NULL);
|
||||
json_out_start(ret, NULL, '{');
|
||||
json_out_start(ret, "pay", '[');
|
||||
ret = jsonrpc_stream_success(cmd);
|
||||
json_array_start(ret, "pay");
|
||||
|
||||
/* FIXME: Index by bolt11 string! */
|
||||
list_for_each(&pay_status, ps, list) {
|
||||
if (b11str && !streq(b11str, ps->bolt11))
|
||||
continue;
|
||||
|
||||
json_out_start(ret, NULL, '{');
|
||||
json_out_addstr(ret, "bolt11", ps->bolt11);
|
||||
json_out_add_u64(ret, "msatoshi",
|
||||
json_object_start(ret, NULL);
|
||||
json_add_string(ret, "bolt11", ps->bolt11);
|
||||
json_add_u64(ret, "msatoshi",
|
||||
ps->msat.millisatoshis); /* Raw: JSON */
|
||||
json_out_addstr(ret, "amount_msat",
|
||||
type_to_string(tmpctx, struct amount_msat,
|
||||
&ps->msat));
|
||||
json_out_addstr(ret, "destination", ps->dest);
|
||||
json_add_string(ret, "amount_msat",
|
||||
type_to_string(tmpctx, struct amount_msat,
|
||||
&ps->msat));
|
||||
json_add_string(ret, "destination", ps->dest);
|
||||
if (ps->label)
|
||||
json_out_addstr(ret, "label", ps->label);
|
||||
json_add_string(ret, "label", ps->label);
|
||||
if (ps->routehint_modifications)
|
||||
json_out_addstr(ret, "routehint_modifications",
|
||||
json_add_string(ret, "routehint_modifications",
|
||||
ps->routehint_modifications);
|
||||
if (ps->shadow && !streq(ps->shadow, ""))
|
||||
json_out_addstr(ret, "shadow", ps->shadow);
|
||||
json_add_string(ret, "shadow", ps->shadow);
|
||||
if (ps->exclusions)
|
||||
json_out_addstr(ret, "local_exclusions", ps->exclusions);
|
||||
json_add_string(ret, "local_exclusions", ps->exclusions);
|
||||
|
||||
assert(tal_count(ps->attempts));
|
||||
json_out_start(ret, "attempts", '[');
|
||||
json_array_start(ret, "attempts");
|
||||
for (size_t i = 0; i < tal_count(ps->attempts); i++)
|
||||
add_attempt(ret, ps, &ps->attempts[i]);
|
||||
json_out_end(ret, ']');
|
||||
json_out_end(ret, '}');
|
||||
json_array_end(ret);
|
||||
json_object_end(ret);
|
||||
}
|
||||
json_out_end(ret, ']');
|
||||
json_out_end(ret, '}');
|
||||
json_array_end(ret);
|
||||
|
||||
return command_success(cmd, ret);
|
||||
return command_finished(cmd, ret);
|
||||
}
|
||||
|
||||
static bool attempt_ongoing(const char *b11)
|
||||
|
@ -1540,28 +1530,24 @@ static void add_amount_sent(struct plugin *p,
|
|||
type_to_string(tmpctx, struct amount_msat, &sent));
|
||||
}
|
||||
|
||||
static void add_new_entry(struct json_out *ret,
|
||||
static void add_new_entry(struct json_stream *ret,
|
||||
const char *buf,
|
||||
const struct pay_mpp *pm)
|
||||
{
|
||||
json_out_start(ret, NULL, '{');
|
||||
json_out_addstr(ret, "bolt11", pm->b11);
|
||||
json_out_addstr(ret, "status", pm->status);
|
||||
json_object_start(ret, NULL);
|
||||
json_add_string(ret, "bolt11", pm->b11);
|
||||
json_add_string(ret, "status", pm->status);
|
||||
if (pm->label)
|
||||
json_out_add_raw_len(ret, "label",
|
||||
json_tok_full(buf, pm->label),
|
||||
json_tok_full_len(pm->label));
|
||||
json_add_tok(ret, "label", pm->label, buf);
|
||||
if (pm->preimage)
|
||||
json_out_add_raw_len(ret, "preimage",
|
||||
json_tok_full(buf, pm->preimage),
|
||||
json_tok_full_len(pm->preimage));
|
||||
json_out_addstr(ret, "amount_sent_msat",
|
||||
json_add_tok(ret, "preimage", pm->preimage, buf);
|
||||
json_add_string(ret, "amount_sent_msat",
|
||||
fmt_amount_msat(tmpctx, &pm->amount_sent));
|
||||
|
||||
if (pm->num_nonfailed_parts > 1)
|
||||
json_out_add_u64(ret, "number_of_parts",
|
||||
pm->num_nonfailed_parts);
|
||||
json_out_end(ret, '}');
|
||||
json_add_u64(ret, "number_of_parts",
|
||||
pm->num_nonfailed_parts);
|
||||
json_object_end(ret);
|
||||
}
|
||||
|
||||
static struct command_result *listsendpays_done(struct command *cmd,
|
||||
|
@ -1571,7 +1557,7 @@ static struct command_result *listsendpays_done(struct command *cmd,
|
|||
{
|
||||
size_t i;
|
||||
const jsmntok_t *t, *arr;
|
||||
struct json_out *ret;
|
||||
struct json_stream *ret;
|
||||
struct pay_map pay_map;
|
||||
struct pay_map_iter it;
|
||||
struct pay_mpp *pm;
|
||||
|
@ -1583,9 +1569,8 @@ static struct command_result *listsendpays_done(struct command *cmd,
|
|||
return command_fail(cmd, LIGHTNINGD,
|
||||
"Unexpected non-array result from listsendpays");
|
||||
|
||||
ret = json_out_new(NULL);
|
||||
json_out_start(ret, NULL, '{');
|
||||
json_out_start(ret, "pays", '[');
|
||||
ret = jsonrpc_stream_success(cmd);
|
||||
json_array_start(ret, "pays");
|
||||
json_for_each_arr(i, t, arr) {
|
||||
const jsmntok_t *status, *b11tok;
|
||||
const char *b11;
|
||||
|
@ -1643,9 +1628,8 @@ static struct command_result *listsendpays_done(struct command *cmd,
|
|||
}
|
||||
pay_map_clear(&pay_map);
|
||||
|
||||
json_out_end(ret, ']');
|
||||
json_out_end(ret, '}');
|
||||
return command_success(cmd, ret);
|
||||
json_array_end(ret);
|
||||
return command_finished(cmd, ret);
|
||||
}
|
||||
|
||||
static struct command_result *json_listpays(struct command *cmd,
|
||||
|
|
Loading…
Add table
Reference in a new issue