lib: convert termtable to json

Add a function that returns a JSON-C structure containing a representation
of a termtable.  This is intended to be a quick way to implement JSON
output to CLI commands.

Signed-off-by: Eric Kinzie <ekinzie@labn.net>
This commit is contained in:
Eric Kinzie 2022-09-02 16:33:21 +02:00 committed by Louis Scalbert
parent 06ddebc822
commit 42bf1afa5a
2 changed files with 55 additions and 0 deletions

View File

@ -7,6 +7,7 @@
#include <zebra.h>
#include <stdio.h>
#include "lib/json.h"
#include "printfrr.h"
#include "memory.h"
#include "termtable.h"
@ -485,3 +486,45 @@ char *ttable_dump(struct ttable *tt, const char *newline)
return buf;
}
/* Crude conversion from ttable to json array.
* Assume that the first row has column headings.
*
* Formats are:
* d int32
* f double
* l int64
* s string (default)
*/
json_object *ttable_json(struct ttable *tt, const char *const formats)
{
struct ttable_cell *row; /* iteration pointers */
json_object *json = NULL;
json = json_object_new_array();
for (int i = 1; i < tt->nrows; i++) {
json_object *jobj;
json_object *val;
row = tt->table[i];
jobj = json_object_new_object();
json_object_array_add(json, jobj);
for (int j = 0; j < tt->ncols; j++) {
switch (formats[j]) {
case 'd':
case 'l':
val = json_object_new_int64(atol(row[j].text));
break;
case 'f':
val = json_object_new_double(atof(row[j].text));
break;
default:
val = json_object_new_string(row[j].text);
}
json_object_object_add(jobj, tt->table[0][j].text, val);
}
}
return json;
}

View File

@ -8,6 +8,7 @@
#define _TERMTABLE_H_
#include <zebra.h>
#include "lib/json.h"
#ifdef __cplusplus
extern "C" {
@ -277,6 +278,17 @@ void ttable_rowseps(struct ttable *tt, unsigned int row,
*/
char *ttable_dump(struct ttable *tt, const char *newline);
/**
* Convert a table to a JSON array of objects.
*
* Caller must free the returned json_object structure.
*
* @param tt the table to convert
* @param formats an array of characters indicating what JSON type should be
* used.
*/
json_object *ttable_json(struct ttable *tt, const char *const formats);
#ifdef __cplusplus
}
#endif