34#include "pw_assert/assert.h"
35#include "pw_json/internal/nesting.h"
36#include "pw_span/span.h"
37#include "pw_status/status.h"
38#include "pw_status/status_with_size.h"
74 : json_(std::move(nested)) {}
76 json_impl::NestedJson json_;
108 : json_(std::move(nested)) {}
110 json_impl::NestedJson json_;
122 [[nodiscard]]
constexpr bool IsValue()
const;
123 [[nodiscard]]
constexpr bool IsArray()
const;
124 [[nodiscard]]
constexpr bool IsObject()
const;
126 constexpr operator std::string_view()
const;
127 constexpr const char* data()
const;
128 constexpr size_t size()
const;
129 constexpr size_t max_size()
const;
131 [[nodiscard]]
constexpr bool ok()
const;
132 constexpr Status status()
const;
133 constexpr Status last_status()
const;
134 constexpr void clear();
135 constexpr void clear_status();
154 template <
typename T>
172 [[nodiscard]]
constexpr bool IsValue()
const;
173 [[nodiscard]]
constexpr bool IsArray()
const;
174 [[nodiscard]]
constexpr bool IsObject()
const;
176 constexpr operator std::string_view()
const;
177 constexpr const char* data()
const;
178 constexpr size_t size()
const;
179 constexpr size_t max_size()
const;
181 [[nodiscard]]
constexpr bool ok()
const;
182 constexpr Status status()
const;
183 constexpr Status last_status()
const;
184 constexpr void clear();
185 constexpr void clear_status();
191 template <
typename T>
202 template <
typename Iterable>
207 template <
typename T,
size_t kSize>
225 [[nodiscard]]
constexpr bool IsValue()
const;
226 [[nodiscard]]
constexpr bool IsArray()
const;
227 [[nodiscard]]
constexpr bool IsObject()
const;
229 constexpr operator std::string_view()
const;
230 constexpr const char* data()
const;
231 constexpr size_t size()
const;
232 constexpr size_t max_size()
const;
234 [[nodiscard]]
constexpr bool ok()
const;
235 constexpr Status status()
const;
236 constexpr Status last_status()
const;
237 constexpr void clear();
238 constexpr void clear_status();
254 template <
typename T>
257 template <
typename T>
258 constexpr JsonObject&
Add(std::nullptr_t,
const T& value) =
delete;
284 :
JsonBuilder(buffer, buffer_size, Uninitialized{}) {
290 [[nodiscard]]
constexpr bool IsValue()
const {
295 [[nodiscard]]
constexpr bool IsArray()
const {
return buffer_[0] ==
'['; }
298 [[nodiscard]]
constexpr bool IsObject()
const {
return buffer_[0] ==
'{'; }
301 constexpr operator std::string_view()
const {
return {
data(),
size()}; }
304 constexpr const char*
data()
const {
return buffer_; }
307 constexpr size_t size()
const {
return json_size_; }
310 constexpr size_t max_size()
const {
return max_size_; }
313 [[nodiscard]]
constexpr bool ok()
const {
return status().
ok(); }
329 constexpr Status status()
const {
return static_cast<Status::Code
>(status_); }
334 return static_cast<Status::Code
>(last_status_);
338 constexpr void clear() { JsonValueClear(); }
344 template <
typename T>
384 enum class Uninitialized {};
387 constexpr JsonBuilder(
char* buffer,
size_t buffer_size, Uninitialized)
389 max_size_(buffer_size - 1),
395 constexpr void MakeNull() {
404 constexpr void set_json_size(
size_t json_size) { json_size_ = json_size; }
412 friend class JsonValue;
413 friend class JsonArray;
414 friend class JsonObject;
416 friend class NestedJsonArray;
417 friend class NestedJsonObject;
419 constexpr size_t remaining()
const {
return max_size() -
size(); }
422 constexpr void update_status(Status new_status);
426 constexpr void JsonValueClear() {
431 constexpr void JsonArrayClear() {
436 constexpr void JsonObjectClear() {
441 template <
typename T>
442 constexpr Status JsonValueSet(
const T& value);
444 template <
typename T>
445 constexpr JsonArray& JsonArrayAppend(
const T& value);
447 template <
typename Iterator>
450 template <
typename T>
451 constexpr JsonObject& JsonObjectAdd(std::string_view key,
const T& value);
453 [[nodiscard]]
constexpr bool JsonArrayAddElement();
456 [[nodiscard]]
constexpr bool JsonObjectAddKey(std::string_view key);
458 constexpr size_t NestedJsonOffset(
const json_impl::Nesting& nesting)
const {
461 return json_size_ - 3 - nesting.depth();
464 constexpr json_impl::Nesting::Type type()
const {
465 return IsArray() ? json_impl::Nesting::kArray : json_impl::Nesting::kObject;
468 constexpr json_impl::NestedJson JsonArrayAppendNested(
469 const char (&open_close)[2],
const json_impl::Nesting& nesting);
471 constexpr json_impl::NestedJson JsonObjectAddNested(
472 std::string_view key,
473 const char (&open_close)[2],
474 const json_impl::Nesting& nesting);
478 constexpr void AddNestedStart(
const json_impl::Nesting& nesting);
479 constexpr void AddNestedFinish(
const json_impl::Nesting& nesting);
481 template <
typename T>
482 constexpr void NestedJsonArrayAppend(
const T& value,
483 const json_impl::Nesting& nesting);
485 template <
typename T>
486 constexpr void NestedJsonObjectAdd(std::string_view key,
488 const json_impl::Nesting& nesting);
491 constexpr Status HandleSet(StatusWithSize written);
495 constexpr void HandleAdd(StatusWithSize written,
496 size_t starting_size,
499 constexpr void MakeEmpty(
char open,
char close) {
514 uint8_t last_status_;
519template <
size_t kMaxSize>
524 :
JsonBuilder(static_buffer_,
sizeof(static_buffer_), Uninitialized{}),
529 template <
typename T>
530 static constexpr JsonBuffer Value(
const T& initial_value) {
542 template <
size_t kOtherSize>
552 template <
size_t kOtherSize>
558 static constexpr size_t max_size() {
return kMaxSize; }
562 "JsonBuffers require at least 4 bytes");
564 template <
size_t kOtherSize>
566 static_assert(kOtherSize <= kMaxSize,
567 "A JsonBuffer cannot be copied into a smaller buffer");
571 constexpr void CopyFrom(
const JsonBuilder& other) {
572 for (
size_t i = 0; i < other.
size() + 1 ; ++i) {
573 static_buffer_[i] = other.
data()[i];
575 JsonBuilder::set_json_size(other.
size());
579 char static_buffer_[kMaxSize + 1];
587#include "pw_json/internal/builder_impl.h"
Definition: builder.h:166
constexpr JsonArray & Extend(const T(&iterable)[kSize])
constexpr JsonArray & Append(const T &value)
constexpr JsonArray & Extend(const Iterable &iterable)
constexpr NestedJsonArray AppendNestedArray()
Appends a nested array to this array.
constexpr NestedJsonObject AppendNestedObject()
Appends a nested object to this array.
Definition: builder.h:520
Definition: builder.h:273
constexpr Status status() const
Definition: builder.h:329
constexpr bool IsArray() const
True if the top-level JSON entity is an array.
Definition: builder.h:295
constexpr JsonBuilder(char *buffer, size_t buffer_size)
Initializes to the value null. buffer_size must be at least 5.
Definition: builder.h:283
constexpr JsonObject & StartObject()
Definition: builder.h:378
constexpr size_t max_size() const
The maximum size of the JSON string, excluding the null terminator.
Definition: builder.h:310
constexpr bool IsValue() const
True if the top-level JSON entity is a simple value (not array or object).
Definition: builder.h:290
constexpr Status last_status() const
Definition: builder.h:333
constexpr JsonBuilder(span< char > buffer)
Initializes to the value null. buffer.size() must be at least 5.
Definition: builder.h:279
constexpr const char * data() const
Pointer to the serialized JSON, which is always a null-terminated string.
Definition: builder.h:304
constexpr Status SetValue(const T &value)
Clears the JSON and sets it to a single JSON value (see JsonValue::Set).
constexpr size_t size() const
The current size of the JSON string, excluding the null terminator.
Definition: builder.h:307
constexpr bool ok() const
True if.
Definition: builder.h:313
constexpr void clear()
Sets the JSON null and clears the status.
Definition: builder.h:338
constexpr JsonArray & StartArray()
Definition: builder.h:363
constexpr void clear_status()
Resets status() and last_status().
Definition: builder.h:341
static constexpr size_t MinBufferSize()
JsonBuilder requires at least 5 characters in its buffer.
Definition: builder.h:276
constexpr JsonValue & StartValue()
Definition: builder.h:349
constexpr bool IsObject() const
True if the top-level JSON entity is an object.
Definition: builder.h:298
Definition: builder.h:219
constexpr JsonObject & Add(std::string_view key, const T &value)
Definition: builder.h:116
constexpr Status Set(const T &value)
constexpr NestedJsonObject AppendNestedObject()
Appends a new nested object to this nested array.
constexpr NestedJsonArray AppendNestedArray()
Appends a new nested array to this nested array.
constexpr NestedJsonArray & Append(const T &value)
Appends to the nested array.
constexpr NestedJsonArray AddNestedArray(std::string_view key)
Adds a nested array to the nested object.
constexpr NestedJsonObject & Add(std::string_view key, const T &value)
Adds a key-value pair to the nested object.
constexpr NestedJsonObject AddNestedObject(std::string_view key)
Adds a nested object to the nested object.
constexpr Code code() const
Returns the Status::Code (pw_Status) for this Status.
Definition: status.h:151
constexpr bool ok() const
Definition: status.h:156
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27
constexpr Status OkStatus()
Definition: status.h:233