1// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4
5#ifndef RUNTIME_VM_JSON_WRITER_H_
6#define RUNTIME_VM_JSON_WRITER_H_
7
8#include "platform/allocation.h"
9#include "platform/text_buffer.h"
10
11namespace dart {
12
13class String;
14
15class JSONWriter : ValueObject {
16 public:
17 explicit JSONWriter(intptr_t buf_size = 256);
18
19 TextBuffer* buffer() { return &buffer_; }
20 const char* ToCString() { return buffer_.buffer(); }
21
22 void Steal(char** buffer, intptr_t* buffer_length);
23
24 void PrintCommaIfNeeded();
25
26 // Append |serialized_object| to the stream.
27 void AppendSerializedObject(const char* serialized_object);
28
29 // Append |buffer| to the stream.
30 void AppendSerializedObject(const uint8_t* buffer, intptr_t buffer_length);
31
32 // Append |serialized_object| to the stream with |property_name|.
33 void AppendSerializedObject(const char* property_name,
34 const char* serialized_object);
35
36 void OpenObject(const char* property_name = NULL);
37 void CloseObject();
38 void UncloseObject();
39
40 void OpenArray(const char* property_name = NULL);
41 void CloseArray();
42
43 void Clear();
44
45 void PrintValueNull();
46 void PrintValueBool(bool b);
47 void PrintValue(intptr_t i);
48 void PrintValue64(int64_t i);
49 void PrintValue(double d);
50 void PrintValueBase64(const uint8_t* bytes, intptr_t length);
51 void PrintValue(const char* s);
52 void PrintValue(const char* s, intptr_t len);
53 void PrintValueNoEscape(const char* s);
54 void PrintfValue(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
55 void VPrintfValue(const char* format, va_list args);
56 bool PrintValueStr(const String& s, intptr_t offset, intptr_t count);
57
58 void PrintPropertyBool(const char* name, bool b);
59 void PrintProperty(const char* name, intptr_t i);
60 void PrintProperty64(const char* name, int64_t i);
61 void PrintProperty(const char* name, double d);
62 void PrintPropertyBase64(const char* name,
63 const uint8_t* bytes,
64 intptr_t length);
65 void PrintProperty(const char* name, const char* s);
66 bool PrintPropertyStr(const char* name,
67 const String& s,
68 intptr_t offset = 0,
69 intptr_t count = -1);
70 void PrintPropertyNoEscape(const char* name, const char* s);
71 void PrintfProperty(const char* name, const char* format, ...)
72 PRINTF_ATTRIBUTE(3, 4);
73 void VPrintfProperty(const char* name, const char* format, va_list args);
74
75 void PrintPropertyName(const char* name);
76
77 void PrintNewline();
78
79 void AddEscapedUTF8String(const char* s);
80 void AddEscapedUTF8String(const char* s, intptr_t len);
81
82 private:
83 bool NeedComma();
84 bool AddDartString(const String& s, intptr_t offset, intptr_t count);
85
86 // Debug only fatal assertion.
87 static void EnsureIntegerIsRepresentableInJavaScript(int64_t i);
88
89 intptr_t open_objects_;
90 TextBuffer buffer_;
91};
92
93} // namespace dart
94
95#endif // RUNTIME_VM_JSON_WRITER_H_
96