| ... | @@ -1012,119 +1012,39 @@ pub const Value = union(enum) { | ... | @@ -1012,119 +1012,39 @@ pub const Value = union(enum) { |
| 1012 | Object: ObjectMap, | 1012 | Object: ObjectMap, |
| 1013 | | 1013 | |
| 1014 | pub fn dump(self: Value) void { | 1014 | pub fn dump(self: Value) void { |
| 1015 | switch (self) { | 1015 | var held = std.debug.getStderrMutex().acquire(); |
| 1016 | Value.Null => { | 1016 | defer held.release(); |
| 1017 | debug.warn("null"); | 1017 | |
| 1018 | }, | 1018 | const stderr = std.debug.getStderrStream() catch return; |
| 1019 | Value.Bool => |inner| { | 1019 | self.dumpStream(stderr, 1024) catch return; |
| 1020 | debug.warn("{}", inner); | | |
| 1021 | }, | | |
| 1022 | Value.Integer => |inner| { | | |
| 1023 | debug.warn("{}", inner); | | |
| 1024 | }, | | |
| 1025 | Value.Float => |inner| { | | |
| 1026 | debug.warn("{:.5}", inner); | | |
| 1027 | }, | | |
| 1028 | Value.String => |inner| { | | |
| 1029 | debug.warn("\"{}\"", inner); | | |
| 1030 | }, | | |
| 1031 | Value.Array => |inner| { | | |
| 1032 | var not_first = false; | | |
| 1033 | debug.warn("["); | | |
| 1034 | for (inner.toSliceConst()) |value| { | | |
| 1035 | if (not_first) { | | |
| 1036 | debug.warn(","); | | |
| 1037 | } | | |
| 1038 | not_first = true; | | |
| 1039 | value.dump(); | | |
| 1040 | } | | |
| 1041 | debug.warn("]"); | | |
| 1042 | }, | | |
| 1043 | Value.Object => |inner| { | | |
| 1044 | var not_first = false; | | |
| 1045 | debug.warn("{{"); | | |
| 1046 | var it = inner.iterator(); | | |
| 1047 | | | |
| 1048 | while (it.next()) |entry| { | | |
| 1049 | if (not_first) { | | |
| 1050 | debug.warn(","); | | |
| 1051 | } | | |
| 1052 | not_first = true; | | |
| 1053 | debug.warn("\"{}\":", entry.key); | | |
| 1054 | entry.value.dump(); | | |
| 1055 | } | | |
| 1056 | debug.warn("}}"); | | |
| 1057 | }, | | |
| 1058 | } | | |
| 1059 | } | 1020 | } |
| 1060 | | 1021 | |
| 1061 | pub fn dumpIndent(self: Value, indent: usize) void { | 1022 | pub fn dumpIndent(self: Value, comptime indent: usize) void { |
| 1062 | if (indent == 0) { | 1023 | if (indent == 0) { |
| 1063 | self.dump(); | 1024 | self.dump(); |
| 1064 | } else { | 1025 | } else { |
| 1065 | self.dumpIndentLevel(indent, 0); | 1026 | var held = std.debug.getStderrMutex().acquire(); |
| | 1027 | defer held.release(); |
| | 1028 | |
| | 1029 | const stderr = std.debug.getStderrStream() catch return; |
| | 1030 | self.dumpStreamIndent(indent, stderr, 1024) catch return; |
| 1066 | } | 1031 | } |
| 1067 | } | 1032 | } |
| 1068 | | 1033 | |
| 1069 | fn dumpIndentLevel(self: Value, indent: usize, level: usize) void { | 1034 | pub fn dumpStream(self: @This(), stream: var, comptime max_depth: usize) !void { |
| 1070 | switch (self) { | 1035 | var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream); |
| 1071 | Value.Null => { | 1036 | w.newline = ""; |
| 1072 | debug.warn("null"); | 1037 | w.one_indent = ""; |
| 1073 | }, | 1038 | w.space = ""; |
| 1074 | Value.Bool => |inner| { | 1039 | try w.emitJson(self); |
| 1075 | debug.warn("{}", inner); | | |
| 1076 | }, | | |
| 1077 | Value.Integer => |inner| { | | |
| 1078 | debug.warn("{}", inner); | | |
| 1079 | }, | | |
| 1080 | Value.Float => |inner| { | | |
| 1081 | debug.warn("{:.5}", inner); | | |
| 1082 | }, | | |
| 1083 | Value.String => |inner| { | | |
| 1084 | debug.warn("\"{}\"", inner); | | |
| 1085 | }, | | |
| 1086 | Value.Array => |inner| { | | |
| 1087 | var not_first = false; | | |
| 1088 | debug.warn("[\n"); | | |
| 1089 | | | |
| 1090 | for (inner.toSliceConst()) |value| { | | |
| 1091 | if (not_first) { | | |
| 1092 | debug.warn(",\n"); | | |
| 1093 | } | | |
| 1094 | not_first = true; | | |
| 1095 | padSpace(level + indent); | | |
| 1096 | value.dumpIndentLevel(indent, level + indent); | | |
| 1097 | } | | |
| 1098 | debug.warn("\n"); | | |
| 1099 | padSpace(level); | | |
| 1100 | debug.warn("]"); | | |
| 1101 | }, | | |
| 1102 | Value.Object => |inner| { | | |
| 1103 | var not_first = false; | | |
| 1104 | debug.warn("{{\n"); | | |
| 1105 | var it = inner.iterator(); | | |
| 1106 | | | |
| 1107 | while (it.next()) |entry| { | | |
| 1108 | if (not_first) { | | |
| 1109 | debug.warn(",\n"); | | |
| 1110 | } | | |
| 1111 | not_first = true; | | |
| 1112 | padSpace(level + indent); | | |
| 1113 | debug.warn("\"{}\": ", entry.key); | | |
| 1114 | entry.value.dumpIndentLevel(indent, level + indent); | | |
| 1115 | } | | |
| 1116 | debug.warn("\n"); | | |
| 1117 | padSpace(level); | | |
| 1118 | debug.warn("}}"); | | |
| 1119 | }, | | |
| 1120 | } | | |
| 1121 | } | 1040 | } |
| 1122 | | 1041 | |
| 1123 | fn padSpace(indent: usize) void { | 1042 | pub fn dumpStreamIndent(self: @This(), comptime indent: usize, stream: var, comptime max_depth: usize) !void { |
| 1124 | var i: usize = 0; | 1043 | var one_indent = " " ** indent; |
| 1125 | while (i < indent) : (i += 1) { | 1044 | |
| 1126 | debug.warn(" "); | 1045 | var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream); |
| 1127 | } | 1046 | w.one_indent = one_indent; |
| | 1047 | try w.emitJson(self); |
| 1128 | } | 1048 | } |
| 1129 | }; | 1049 | }; |
| 1130 | | 1050 | |