forked from Mirror/frr
lib: add automatic xpath-based completion
Signed-off-by: Christian Hopps <chopps@labn.net>
This commit is contained in:
parent
3fa5a77def
commit
29dba445b4
|
@ -678,6 +678,21 @@ vector cmd_describe_command(vector vline, struct vty *vty, int *status)
|
||||||
|
|
||||||
static struct list *varhandlers = NULL;
|
static struct list *varhandlers = NULL;
|
||||||
|
|
||||||
|
static int __add_key_comp(const struct lyd_node *dnode, void *arg)
|
||||||
|
{
|
||||||
|
const char *key_value = yang_dnode_get_string(dnode, NULL);
|
||||||
|
|
||||||
|
vector_set((vector)arg, XSTRDUP(MTYPE_COMPLETION, key_value));
|
||||||
|
|
||||||
|
return YANG_ITER_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __get_list_keys(vector comps, const char *xpath)
|
||||||
|
{
|
||||||
|
yang_dnode_iterate(__add_key_comp, comps,
|
||||||
|
vty_shared_candidate_config->dnode, "%s", xpath);
|
||||||
|
}
|
||||||
|
|
||||||
void cmd_variable_complete(struct cmd_token *token, const char *arg,
|
void cmd_variable_complete(struct cmd_token *token, const char *arg,
|
||||||
vector comps)
|
vector comps)
|
||||||
{
|
{
|
||||||
|
@ -694,6 +709,9 @@ void cmd_variable_complete(struct cmd_token *token, const char *arg,
|
||||||
if (cvh->varname && (!token->varname
|
if (cvh->varname && (!token->varname
|
||||||
|| strcmp(cvh->varname, token->varname)))
|
|| strcmp(cvh->varname, token->varname)))
|
||||||
continue;
|
continue;
|
||||||
|
if (cvh->xpath)
|
||||||
|
__get_list_keys(tmpcomps, cvh->xpath);
|
||||||
|
if (cvh->completions)
|
||||||
cvh->completions(tmpcomps, token);
|
cvh->completions(tmpcomps, token);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -753,7 +771,7 @@ void cmd_variable_handler_register(const struct cmd_variable_handler *cvh)
|
||||||
if (!varhandlers)
|
if (!varhandlers)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (; cvh->completions; cvh++)
|
for (; cvh->completions || cvh->xpath; cvh++)
|
||||||
listnode_add(varhandlers, (void *)cvh);
|
listnode_add(varhandlers, (void *)cvh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -636,6 +636,7 @@ extern void cmd_banner_motd_line(const char *line);
|
||||||
|
|
||||||
struct cmd_variable_handler {
|
struct cmd_variable_handler {
|
||||||
const char *tokenname, *varname;
|
const char *tokenname, *varname;
|
||||||
|
const char *xpath; /* fill comps from set of values at xpath */
|
||||||
void (*completions)(vector out, struct cmd_token *token);
|
void (*completions)(vector out, struct cmd_token *token);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue