| ... | ... | @@ -1012,119 +1012,39 @@ pub const Value = union(enum) { |
| 1012 | 1012 | Object: ObjectMap, |
| 1013 | 1013 | |
| 1014 | 1014 | pub fn dump(self: Value) void { |
| 1015 | | switch (self) { |
| 1016 | | Value.Null => { |
| 1017 | | debug.warn("null"); |
| 1018 | | }, |
| 1019 | | Value.Bool => |inner| { |
| 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 | | } |
| 1015 | var held = std.debug.getStderrMutex().acquire(); |
| 1016 | defer held.release(); |
| 1017 | |
| 1018 | const stderr = std.debug.getStderrStream() catch return; |
| 1019 | self.dumpStream(stderr, 1024) catch return; |
| 1059 | 1020 | } |
| 1060 | 1021 | |
| 1061 | | pub fn dumpIndent(self: Value, indent: usize) void { |
| 1022 | pub fn dumpIndent(self: Value, comptime indent: usize) void { |
| 1062 | 1023 | if (indent == 0) { |
| 1063 | 1024 | self.dump(); |
| 1064 | 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 { |
| 1070 | | switch (self) { |
| 1071 | | Value.Null => { |
| 1072 | | debug.warn("null"); |
| 1073 | | }, |
| 1074 | | Value.Bool => |inner| { |
| 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 | | } |
| 1034 | pub fn dumpStream(self: @This(), stream: var, comptime max_depth: usize) !void { |
| 1035 | var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream); |
| 1036 | w.newline = ""; |
| 1037 | w.one_indent = ""; |
| 1038 | w.space = ""; |
| 1039 | try w.emitJson(self); |
| 1121 | 1040 | } |
| 1122 | 1041 | |
| 1123 | | fn padSpace(indent: usize) void { |
| 1124 | | var i: usize = 0; |
| 1125 | | while (i < indent) : (i += 1) { |
| 1126 | | debug.warn(" "); |
| 1127 | | } |
| 1042 | pub fn dumpStreamIndent(self: @This(), comptime indent: usize, stream: var, comptime max_depth: usize) !void { |
| 1043 | var one_indent = " " ** indent; |
| 1044 | |
| 1045 | var w = std.json.WriteStream(@typeOf(stream).Child, max_depth).init(stream); |
| 1046 | w.one_indent = one_indent; |
| 1047 | try w.emitJson(self); |
| 1128 | 1048 | } |
| 1129 | 1049 | }; |
| 1130 | 1050 | |