nlib
JsonStreamGenerator.h
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMGENERATOR_H_
4 #define INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMGENERATOR_H_
5 
7 
8 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS)
9 #undef NLIB_VIS_PUBLIC
10 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT
11 #endif
12 NLIB_NAMESPACE_BEGIN
13 class OutputStream;
14 namespace msgpack {
15 
17  bool msgpack;
20  bool strict;
22  : msgpack(false), pretty_print(false),
23  omit_utf8_checking(false), strict(false) {}
24 };
25 
27  public:
28  enum Error {
29  ERROR_OK = 0,
30  ERROR_KEY_REQUIRED,
31  ERROR_KEY_FORBIDDEN,
32  ERROR_ENDARRAY_REQUIRED,
33  ERROR_ENDARRAY_FORBIDDEN,
34  ERROR_ENDMAP_REQUIRED,
35  ERROR_ENDMAP_FORBIDDEN,
36  ERROR_STRING_UTF8,
37  ERROR_STREAM,
38  ERROR_ENOMEM,
39  ERROR_ARRAY_OR_MAP_REQUIRED,
40  ERROR_DOCUMENT_END,
41  ERROR_BINARY_NOT_AVAILABLE,
42  ERROR_EXT_NOT_AVAILABLE,
43  ERROR_EINVAL
44  };
45 
46  public:
47  static errno_t Generate(size_t* written, char* str, size_t n, const MpObject& obj,
48  const JsonStreamGeneratorSettings& settings)
50  static errno_t Generate(size_t* written, char* str, size_t n, const MpObject& obj)
53  return Generate(written, str, n, obj, settings);
54  }
55  template<size_t N>
56  static errno_t Generate(size_t* written, char(&str)[N], const MpObject& obj,
58  return Generate(written, str, N, obj, settings);
59  }
60  template<size_t N>
61  static errno_t Generate(size_t* written, char (&str)[N], const MpObject& obj) NLIB_NOEXCEPT {
63  return Generate(written, str, N, obj, settings);
64  }
65 
66  JsonStreamGenerator() NLIB_NOEXCEPT : prv_(NULL), error_(ERROR_OK) {}
69  errno_t Init() NLIB_NOEXCEPT {
71  return Init(settings);
72  }
73  errno_t Open(OutputStream* stream) NLIB_NOEXCEPT NLIB_NONNULL;
74  bool Flush() NLIB_NOEXCEPT;
75  errno_t Close() NLIB_NOEXCEPT;
76 
77  JsonStreamGenerator& StartArray(size_t count) NLIB_NOEXCEPT;
78  JsonStreamGenerator& StartMap(size_t count) NLIB_NOEXCEPT;
79  JsonStreamGenerator& Key(const char* key) NLIB_NOEXCEPT NLIB_NONNULL;
83  JsonStreamGenerator& Boolean(bool value) NLIB_NOEXCEPT;
84  JsonStreamGenerator& Int8(int8_t num) NLIB_NOEXCEPT;
85  JsonStreamGenerator& Uint8(uint8_t num) NLIB_NOEXCEPT;
86  JsonStreamGenerator& Int16(int16_t num) NLIB_NOEXCEPT;
87  JsonStreamGenerator& Uint16(uint16_t num) NLIB_NOEXCEPT;
88  JsonStreamGenerator& Int32(int32_t num) NLIB_NOEXCEPT;
89  JsonStreamGenerator& Uint32(uint32_t num) NLIB_NOEXCEPT;
90  JsonStreamGenerator& Int64(int64_t num) NLIB_NOEXCEPT;
91  JsonStreamGenerator& Uint64(uint64_t num) NLIB_NOEXCEPT;
92  JsonStreamGenerator& Float(float num) NLIB_NOEXCEPT;
93  JsonStreamGenerator& Double(double num) NLIB_NOEXCEPT;
94  JsonStreamGenerator& String(const char* str) NLIB_NOEXCEPT NLIB_NONNULL;
95  JsonStreamGenerator& Binary(const void* bin, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
96  JsonStreamGenerator& Ext(int8_t tp, const void* bin, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
97  JsonStreamGenerator& Object(const MpObject& obj) NLIB_NOEXCEPT;
98 
99  template<class STDSTRING>
100  JsonStreamGenerator& String(const STDSTRING& str) NLIB_NOEXCEPT {
101  return String(str.c_str());
102  }
103  JsonStreamGenerator& EmptyArray() NLIB_NOEXCEPT { return StartArray(0).EndArray(); }
104  JsonStreamGenerator& EmptyMap() NLIB_NOEXCEPT { return StartMap(0).EndMap(); }
105  JsonStreamGenerator& Int8Array(const int8_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
106  JsonStreamGenerator& Uint8Array(const uint8_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
107  JsonStreamGenerator& Int16Array(const int16_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
108  JsonStreamGenerator& Uint16Array(const uint16_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
109  JsonStreamGenerator& Int32Array(const int32_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
110  JsonStreamGenerator& Uint32Array(const uint32_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
111  JsonStreamGenerator& Int64Array(const int64_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
112  JsonStreamGenerator& Uint64Array(const uint64_t* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
113  JsonStreamGenerator& FloatArray(const float* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
114  JsonStreamGenerator& DoubleArray(const double* p, size_t count) NLIB_NOEXCEPT NLIB_NONNULL;
115  Error GetError() const NLIB_NOEXCEPT { return error_; }
116  NLIB_SAFE_BOOL(JsonStreamGenerator, error_ == ERROR_OK);
117 
118  private:
119  struct State;
120  NLIB_VIS_HIDDEN State* WriteStartSeq_(size_t count) NLIB_NOEXCEPT;
121  NLIB_VIS_HIDDEN bool JsonIndent_(size_t level) NLIB_NOEXCEPT;
122  NLIB_VIS_HIDDEN bool CheckAndStateChange_() NLIB_NOEXCEPT;
123  NLIB_VIS_HIDDEN bool WriteJsonString_(const char* str, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
124  NLIB_VIS_HIDDEN bool WriteMsgpackString_(const char* str, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
125  NLIB_VIS_HIDDEN void String_(const char* str, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
126  NLIB_VIS_HIDDEN void Key_(const char* key, size_t n) NLIB_NOEXCEPT NLIB_NONNULL;
127 
128  struct JsonStreamGeneratorPrivate;
129  JsonStreamGeneratorPrivate* prv_;
130  Error error_;
131 };
132 
133 } // namespace msgpack
134 NLIB_NAMESPACE_END
135 
136 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS)
137 #undef NLIB_VIS_PUBLIC
138 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT
139 #endif
140 
141 #endif // INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMGENERATOR_H_
static errno_t Generate(size_t *written, char(&str)[N], const MpObject &obj) noexcept
Runs Generate(written, str, N, obj, settings) with the default JsonStreamGeneratorSettings settings s...
errno_t Init() noexcept
Initializes the parser using the default settings.
bool strict
If true, generates an error if the first output is not an array or map.
JsonStreamGenerator & EmptyArray() noexcept
Outputs an empty array.
#define NLIB_SAFE_BOOL(class_name, exp)
Defines a safe operator bool function in the class. Uses the C++11 explicit bool if it is available f...
Definition: Config.h:160
JsonStreamGenerator & EndArray() noexcept
Finishes the array.
Error GetError() const noexcept
Gets an error.
JsonStreamGenerator() noexcept
Instantiates the object with default parameters (default constructor).
#define NLIB_VIS_HIDDEN
Symbols for functions and classes are not made available outside of the library.
Definition: Platform_unix.h:60
#define NLIB_VIS_PUBLIC
Symbols for functions and classes are made available outside of the library.
Definition: Platform_unix.h:61
bool omit_utf8_checking
If true, checking if the string is UTF-8 is skipped when outputting the string.
Object created when MessagePack or JSON is read.
Definition: MpObject.h:82
static errno_t Generate(size_t *written, char(&str)[N], const MpObject &obj, const JsonStreamGeneratorSettings &settings) noexcept
Runs Generate(written, str, N, obj, settings).
static errno_t Generate(size_t *written, char *str, size_t n, const MpObject &obj) noexcept
Runs Generate(written, str, n, obj, settings) with the default JsonStreamGeneratorSettings settings s...
#define NLIB_NONNULL_2
Indicates that you cannot specify NULL for the second argument.
Definition: Platform_unix.h:78
JsonStreamGenerator & String(const STDSTRING &str) noexcept
Outputs a string.
bool msgpack
If true, JsonStreamGenerator outputs JSON; if false, it outputs msgpack.
Object created when MessagePack, JSON, or CSV is read.
constexpr JsonStreamGeneratorSettings() noexcept
Instantiates the object with default parameters (default constructor). Sets each data member to the d...
#define NLIB_NOEXCEPT
Defines noexcept geared to the environment, or the equivalent.
Definition: Config.h:86
#define NLIB_CEXPR
Defines constexpr if it is available for use. If not, holds an empty string.
Definition: Config.h:80
bool pretty_print
If true, outputs formatted JSON when outputting JSON.
#define NLIB_FINAL
Defines final if it is available for use. If not, holds an empty string.
Definition: Config.h:211
Data structure used to store the JsonStreamGenerator settings parameters.
JsonStreamGenerator & EndMap() noexcept
Finishes the map.
JsonStreamGenerator & EmptyMap() noexcept
Outputs an empty map.
Class for outputting JSON or msgpack.
#define NLIB_NONNULL
Indicates that you cannot specify NULL for all arguments.
Definition: Platform_unix.h:76
The base class for output streams. This class cannot be instantiated.
Definition: OutputStream.h:17
int errno_t
Indicates with an int-type typedef that a POSIX error value is returned as the return value...
Definition: NMalloc.h:24