blob: 6deb6637b06a1e9d1e89308d1d9e7f064e5634e3 [file] [log] [blame]
#ifndef AOS_JSON_TO_FLATBUFFER_H_
#define AOS_JSON_TO_FLATBUFFER_H_
#include <cstddef>
#include <string>
#include "flatbuffers/flatbuffers.h"
namespace aos {
// Parses the flatbuffer into the vector, or returns an empty vector.
::std::vector<uint8_t> JsonToFlatbuffer(
const char *data, const flatbuffers::TypeTable *typetable);
// Converts a flatbuffer into a Json string.
//
// multi_line controls if the Json is written out on multiple lines or one.
::std::string FlatbufferToJson(const uint8_t *buffer,
const flatbuffers::TypeTable *typetable,
bool multi_line = false);
// This class implements the state machine at json.org
class Tokenizer {
public:
Tokenizer(const char *data) : data_(data) {}
enum class TokenType {
kEnd,
kError,
kStartObject,
kEndObject,
kStartArray,
kEndArray,
kField,
kNumberValue,
kStringValue,
kTrueValue,
kFalseValue,
};
// Returns the next token.
TokenType Next();
// Returns the last field_name and field_value. These are only valid when
// Next returns them.
const ::std::string &field_name() const { return field_name_; }
const ::std::string &field_value() const { return field_value_; }
// Parses the current field value as a long long. Returns false if it failed
// to parse.
bool FieldAsInt(long long *value);
// Parses the current field value as a double. Returns false if it failed
// to parse.
bool FieldAsDouble(double *value);
// Returns true if we are at the end of the input.
bool AtEnd() { return *data_ == '\0'; }
const char *data_left() const { return data_; }
private:
// Consumes a string out of data_. Populates s with the string. Returns true
// if a valid string was found, and false otherwise.
// data_ is updated only on success.
bool ConsumeString(::std::string *s);
// Consumes a number out of data_. Populates s with the string containing the
// number. Returns true if a valid number was found, and false otherwise.
// data_ is updated only on success.
bool ConsumeNumber(::std::string *s);
// Consumes a fixed token out of data_. Returns true if the string was found,
// and false otherwise.
// data_ is updated only on success.
bool Consume(const char* token);
// Consumes whitespace out of data_. Returns true if the string was found,
// and false otherwise.
// data_ is unconditionally updated.
void ConsumeWhitespace();
// State for the parsing state machine.
enum class State {
kExpectField,
kExpectObjectStart,
kExpectObjectEnd,
kExpectArrayEnd,
kExpectValue,
kExpectEnd,
};
State state_ = State::kExpectObjectStart;
// Data pointer.
const char *data_;
// Current line number used for printing debug.
int linenumber_ = 0;
// Stack used to track which object type we were in when we recursed.
enum class ObjectType {
kObject,
kArray,
};
::std::vector<ObjectType> object_type_;
// Last field name.
::std::string field_name_;
// Last field value.
::std::string field_value_;
};
} // namespace aos
#endif // AOS_JSON_TO_FLATBUFFER_H_