JsonArraySerializer.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * Copyright (c) 2019-2020, Sergey Bugaev <bugaevc@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/JsonValue.h>
  8. namespace AK {
  9. template<typename Builder>
  10. class JsonObjectSerializer;
  11. template<typename Builder>
  12. class JsonArraySerializer {
  13. public:
  14. explicit JsonArraySerializer(Builder& builder)
  15. : m_builder(builder)
  16. {
  17. (void)m_builder.append('[');
  18. }
  19. JsonArraySerializer(const JsonArraySerializer&) = delete;
  20. JsonArraySerializer(JsonArraySerializer&&) = delete;
  21. ~JsonArraySerializer()
  22. {
  23. if (!m_finished)
  24. finish();
  25. }
  26. #ifndef KERNEL
  27. void add(const JsonValue& value)
  28. {
  29. begin_item();
  30. value.serialize(m_builder);
  31. }
  32. #endif
  33. void add(StringView value)
  34. {
  35. begin_item();
  36. (void)m_builder.append('"');
  37. (void)m_builder.append_escaped_for_json(value);
  38. (void)m_builder.append('"');
  39. }
  40. void add(const String& value)
  41. {
  42. begin_item();
  43. (void)m_builder.append('"');
  44. (void)m_builder.append_escaped_for_json(value);
  45. (void)m_builder.append('"');
  46. }
  47. void add(const char* value)
  48. {
  49. begin_item();
  50. (void)m_builder.append('"');
  51. (void)m_builder.append_escaped_for_json(value);
  52. (void)m_builder.append('"');
  53. }
  54. void add(bool value)
  55. {
  56. begin_item();
  57. (void)m_builder.append(value ? "true"sv : "false"sv);
  58. }
  59. void add(int value)
  60. {
  61. begin_item();
  62. (void)m_builder.appendff("{}", value);
  63. }
  64. void add(unsigned value)
  65. {
  66. begin_item();
  67. (void)m_builder.appendff("{}", value);
  68. }
  69. void add(long value)
  70. {
  71. begin_item();
  72. (void)m_builder.appendff("{}", value);
  73. }
  74. void add(long unsigned value)
  75. {
  76. begin_item();
  77. (void)m_builder.appendff("{}", value);
  78. }
  79. void add(long long value)
  80. {
  81. begin_item();
  82. (void)m_builder.appendff("{}", value);
  83. }
  84. void add(long long unsigned value)
  85. {
  86. begin_item();
  87. (void)m_builder.appendff("{}", value);
  88. }
  89. JsonArraySerializer<Builder> add_array()
  90. {
  91. begin_item();
  92. return JsonArraySerializer(m_builder);
  93. }
  94. // Implemented in JsonObjectSerializer.h
  95. JsonObjectSerializer<Builder> add_object();
  96. void finish()
  97. {
  98. VERIFY(!m_finished);
  99. m_finished = true;
  100. (void)m_builder.append(']');
  101. }
  102. private:
  103. void begin_item()
  104. {
  105. if (!m_empty)
  106. (void)m_builder.append(',');
  107. m_empty = false;
  108. }
  109. Builder& m_builder;
  110. bool m_empty { true };
  111. bool m_finished { false };
  112. };
  113. }
  114. using AK::JsonArraySerializer;