lokinet/llarp/util/json.hpp

123 lines
2.3 KiB
C++
Raw Normal View History

2019-02-15 23:04:04 +00:00
#ifndef LLARP_UTIL_JSON_HPP
#define LLARP_UTIL_JSON_HPP
2018-10-25 17:03:25 +00:00
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
2019-02-15 23:04:04 +00:00
#include <memory>
2019-02-08 22:44:21 +00:00
#include <iostream>
2019-02-15 23:04:04 +00:00
namespace llarp
2018-10-25 17:03:25 +00:00
{
namespace json
{
/// add this because debian stable doesn't have it
template < typename StreamType >
class BasicOStreamWrapper
{
public:
typedef typename StreamType::char_type Ch;
BasicOStreamWrapper(StreamType& stream) : stream_(stream)
{
}
void
Put(Ch c)
{
stream_.put(c);
}
void
Flush()
{
stream_.flush();
}
// Not implemented
char
Peek() const
{
RAPIDJSON_ASSERT(false);
return 0;
}
char
Take()
{
RAPIDJSON_ASSERT(false);
return 0;
}
size_t
Tell() const
{
RAPIDJSON_ASSERT(false);
return 0;
}
char*
PutBegin()
{
RAPIDJSON_ASSERT(false);
return 0;
}
size_t
PutEnd(char*)
{
RAPIDJSON_ASSERT(false);
return 0;
}
private:
BasicOStreamWrapper(const BasicOStreamWrapper&);
BasicOStreamWrapper&
operator=(const BasicOStreamWrapper&);
StreamType& stream_;
};
using Document = rapidjson::Document;
using Value = rapidjson::Value;
using Stream = BasicOStreamWrapper< std::ostream >;
using Writer = rapidjson::Writer< Stream >;
2018-10-25 17:03:25 +00:00
} // namespace json
2019-02-08 19:43:25 +00:00
2018-11-01 12:47:14 +00:00
#if __cplusplus >= 201703L
using string_view = std::string_view;
#else
using string_view = std::string;
#endif
2018-10-25 17:03:25 +00:00
namespace json
{
struct IParser
{
virtual ~IParser(){};
/// result from feeding data to parser
enum Result
{
/// we need more data to finish parsing
eNeedData,
/// we have parsed the object fully
eDone,
/// we have a parsing syntax error
eParseError
};
/// feed data to parser return true if successful
virtual bool
FeedData(const char* buf, size_t sz) = 0;
2018-10-25 17:03:25 +00:00
/// parse internal buffer
virtual Result
Parse(Document& obj) const = 0;
2018-10-25 17:03:25 +00:00
};
/// create new parser
IParser*
2018-10-25 17:03:25 +00:00
MakeParser(size_t contentSize);
void
ToString(const json::Document& obj, std::ostream& out);
2018-10-25 17:03:25 +00:00
} // namespace json
2019-02-15 23:04:04 +00:00
} // namespace llarp
#endif