mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-19 05:44:12 +01:00
lightning-cli: keyword mode.
By default, autodetect, but that's unreliable, so use -k/-o to force interpretation. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
327e2b8fd8
commit
c3bd78433f
@ -94,7 +94,7 @@ static size_t human_readable(const char *buffer, const jsmntok_t *t, char term)
|
|||||||
enum format {
|
enum format {
|
||||||
JSON,
|
JSON,
|
||||||
HUMAN,
|
HUMAN,
|
||||||
DEFAULT
|
DEFAULT_FORMAT
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *opt_set_human(enum format *format)
|
static char *opt_set_human(enum format *format)
|
||||||
@ -109,6 +109,48 @@ static char *opt_set_json(enum format *format)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum input {
|
||||||
|
KEYWORDS,
|
||||||
|
ORDERED,
|
||||||
|
DEFAULT_INPUT
|
||||||
|
};
|
||||||
|
|
||||||
|
static char *opt_set_keywords(enum input *input)
|
||||||
|
{
|
||||||
|
*input = KEYWORDS;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *opt_set_ordered(enum input *input)
|
||||||
|
{
|
||||||
|
*input = ORDERED;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_literal(const char *arg)
|
||||||
|
{
|
||||||
|
return strspn(arg, "0123456789") == strlen(arg)
|
||||||
|
|| streq(arg, "true")
|
||||||
|
|| streq(arg, "false")
|
||||||
|
|| streq(arg, "null")
|
||||||
|
|| arg[0] == '{'
|
||||||
|
|| arg[0] == '['
|
||||||
|
|| arg[0] == '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
static void add_input(char **cmd, const char *input,
|
||||||
|
int i, int argc)
|
||||||
|
{
|
||||||
|
/* Numbers, bools, objects and arrays are left unquoted,
|
||||||
|
* and quoted things left alone. */
|
||||||
|
if (is_literal(input))
|
||||||
|
tal_append_fmt(cmd, "%s", input);
|
||||||
|
else
|
||||||
|
tal_append_fmt(cmd, "\"%s\"", input);
|
||||||
|
if (i != argc - 1)
|
||||||
|
tal_append_fmt(cmd, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int fd, i, off;
|
int fd, i, off;
|
||||||
@ -121,7 +163,8 @@ int main(int argc, char *argv[])
|
|||||||
const tal_t *ctx = tal(NULL, char);
|
const tal_t *ctx = tal(NULL, char);
|
||||||
jsmn_parser parser;
|
jsmn_parser parser;
|
||||||
jsmnerr_t parserr;
|
jsmnerr_t parserr;
|
||||||
enum format format = DEFAULT;
|
enum format format = DEFAULT_FORMAT;
|
||||||
|
enum input input = DEFAULT_INPUT;
|
||||||
|
|
||||||
err_set_progname(argv[0]);
|
err_set_progname(argv[0]);
|
||||||
jsmn_init(&parser);
|
jsmn_init(&parser);
|
||||||
@ -135,6 +178,10 @@ int main(int argc, char *argv[])
|
|||||||
"Human-readable output (default for 'help')");
|
"Human-readable output (default for 'help')");
|
||||||
opt_register_noarg("-J|--json", opt_set_json, &format,
|
opt_register_noarg("-J|--json", opt_set_json, &format,
|
||||||
"JSON output (default unless 'help')");
|
"JSON output (default unless 'help')");
|
||||||
|
opt_register_noarg("-k|--keywords", opt_set_keywords, &input,
|
||||||
|
"Use format key=value for <params>");
|
||||||
|
opt_register_noarg("-o|--order", opt_set_ordered, &input,
|
||||||
|
"Use params in order for <params>");
|
||||||
|
|
||||||
opt_register_version();
|
opt_register_version();
|
||||||
|
|
||||||
@ -150,7 +197,7 @@ int main(int argc, char *argv[])
|
|||||||
method = "help";
|
method = "help";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (format == DEFAULT) {
|
if (format == DEFAULT_FORMAT) {
|
||||||
if (streq(method, "help"))
|
if (streq(method, "help"))
|
||||||
format = HUMAN;
|
format = HUMAN;
|
||||||
else
|
else
|
||||||
@ -173,26 +220,38 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
idstr = tal_fmt(ctx, "lightning-cli-%i", getpid());
|
idstr = tal_fmt(ctx, "lightning-cli-%i", getpid());
|
||||||
cmd = tal_fmt(ctx,
|
cmd = tal_fmt(ctx,
|
||||||
"{ \"method\" : \"%s\", \"id\" : \"%s\", \"params\" : [ ",
|
"{ \"method\" : \"%s\", \"id\" : \"%s\", \"params\" : ",
|
||||||
method, idstr);
|
method, idstr);
|
||||||
|
|
||||||
for (i = 2; i < argc; i++) {
|
if (input == DEFAULT_INPUT) {
|
||||||
/* Numbers, bools, objects and arrays are left unquoted,
|
/* Hacky autodetect; only matters if more than single arg */
|
||||||
* and quoted things left alone. */
|
if (argc > 2 && strchr(argv[2], '='))
|
||||||
if (strspn(argv[i], "0123456789") == strlen(argv[i])
|
input = KEYWORDS;
|
||||||
|| streq(argv[i], "true")
|
|
||||||
|| streq(argv[i], "false")
|
|
||||||
|| streq(argv[i], "null")
|
|
||||||
|| argv[i][0] == '{'
|
|
||||||
|| argv[i][0] == '['
|
|
||||||
|| argv[i][0] == '"')
|
|
||||||
tal_append_fmt(&cmd, "%s", argv[i]);
|
|
||||||
else
|
else
|
||||||
tal_append_fmt(&cmd, "\"%s\"", argv[i]);
|
input = ORDERED;
|
||||||
if (i != argc - 1)
|
|
||||||
tal_append_fmt(&cmd, ", ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (input == KEYWORDS) {
|
||||||
|
tal_append_fmt(&cmd, "{ ");
|
||||||
|
for (i = 2; i < argc; i++) {
|
||||||
|
const char *eq = strchr(argv[i], '=');
|
||||||
|
|
||||||
|
if (!eq)
|
||||||
|
err(ERROR_USAGE, "Expected key=value in '%s'",
|
||||||
|
argv[i]);
|
||||||
|
|
||||||
|
tal_append_fmt(&cmd, "\"%.*s\" : ",
|
||||||
|
(int)(eq - argv[i]), argv[i]);
|
||||||
|
|
||||||
|
add_input(&cmd, eq + 1, i, argc);
|
||||||
|
}
|
||||||
|
tal_append_fmt(&cmd, "} }");
|
||||||
|
} else {
|
||||||
|
tal_append_fmt(&cmd, "[ ");
|
||||||
|
for (i = 2; i < argc; i++)
|
||||||
|
add_input(&cmd, argv[i], i, argc);
|
||||||
tal_append_fmt(&cmd, "] }");
|
tal_append_fmt(&cmd, "] }");
|
||||||
|
}
|
||||||
|
|
||||||
if (!write_all(fd, cmd, strlen(cmd)))
|
if (!write_all(fd, cmd, strlen(cmd)))
|
||||||
err(ERROR_TALKING_TO_LIGHTNINGD, "Writing command");
|
err(ERROR_TALKING_TO_LIGHTNINGD, "Writing command");
|
||||||
|
Loading…
Reference in New Issue
Block a user