JSON support
This commit is contained in:
parent
28df600466
commit
52172d3d73
8
Gui.cs
8
Gui.cs
|
@ -124,4 +124,12 @@ static class Gui
|
||||||
f();
|
f();
|
||||||
ImGui.PopFont();
|
ImGui.PopFont();
|
||||||
}
|
}
|
||||||
|
public static void Table(ReadOnlySpan<char> id, int column, Action f)
|
||||||
|
{
|
||||||
|
if(ImGui.BeginTable(id, column))
|
||||||
|
{
|
||||||
|
f();
|
||||||
|
ImGui.EndTable();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,136 @@
|
||||||
|
using System.Text.Json;
|
||||||
|
using ImGuiNET;
|
||||||
|
|
||||||
|
namespace Shoko;
|
||||||
|
|
||||||
|
[MediaType("application/json")]
|
||||||
|
class JsonMediaHandler : MediaHandler
|
||||||
|
{
|
||||||
|
JsonDocument document;
|
||||||
|
MediaHandler fallback;
|
||||||
|
public JsonMediaHandler(ProtoHandler content)
|
||||||
|
{
|
||||||
|
Content = content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Load()
|
||||||
|
{
|
||||||
|
Title = Content.URL.AbsolutePath;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
document = await Task.Run(()=>JsonDocument.Parse(Content.Content));
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Content.Content.Position = 0;
|
||||||
|
Content.MediaType = "text/plain";
|
||||||
|
fallback = GetHandler(Content);
|
||||||
|
await fallback.Load();
|
||||||
|
}
|
||||||
|
OnLoaded();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Render()
|
||||||
|
{
|
||||||
|
if(fallback is not null)
|
||||||
|
fallback.Render();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Gui.Table("json", 3, ()=>{
|
||||||
|
ImGui.TableSetupColumn("Key");
|
||||||
|
ImGui.TableSetupColumn("Type");
|
||||||
|
ImGui.TableSetupColumn("Value");
|
||||||
|
ImGui.TableHeadersRow();
|
||||||
|
RenderNode("root", document.RootElement);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void MenuBar()
|
||||||
|
{
|
||||||
|
if(fallback is not null)
|
||||||
|
fallback.MenuBar();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RenderNode(string name, JsonElement element)
|
||||||
|
{
|
||||||
|
ImGui.TableNextRow();
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
switch(element.ValueKind)
|
||||||
|
{
|
||||||
|
case JsonValueKind.Object: {
|
||||||
|
var node = ImGui.TreeNode(name);
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("Object");
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextDisabled("--");
|
||||||
|
if(node)
|
||||||
|
{
|
||||||
|
foreach (var item in element.EnumerateObject())
|
||||||
|
{
|
||||||
|
RenderNode(item.Name, item.Value);
|
||||||
|
}
|
||||||
|
ImGui.TreePop();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
case JsonValueKind.Array: {
|
||||||
|
var node = ImGui.TreeNode(name);
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("Array");
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextDisabled($"length: {element.GetArrayLength()}");
|
||||||
|
if(node)
|
||||||
|
{
|
||||||
|
var i = 0;
|
||||||
|
foreach (var item in element.EnumerateArray())
|
||||||
|
{
|
||||||
|
RenderNode($"[{i++}]", item);
|
||||||
|
}
|
||||||
|
ImGui.TreePop();
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
case JsonValueKind.String: {
|
||||||
|
ImGui.TextUnformatted(name);
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("String");
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted(element.GetString());
|
||||||
|
} break;
|
||||||
|
case JsonValueKind.Number: {
|
||||||
|
ImGui.TextUnformatted(name);
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("Number");
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted(element.GetString());
|
||||||
|
} break;
|
||||||
|
case JsonValueKind.True: {
|
||||||
|
ImGui.TextUnformatted(name);
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("Boolean");
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("true");
|
||||||
|
} break;
|
||||||
|
case JsonValueKind.False: {
|
||||||
|
ImGui.TextUnformatted(name);
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("Boolean");
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("false");
|
||||||
|
} break;
|
||||||
|
case JsonValueKind.Null: {
|
||||||
|
ImGui.TextUnformatted(name);
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("Null");
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("null");
|
||||||
|
} break;
|
||||||
|
case JsonValueKind.Undefined: {
|
||||||
|
ImGui.TextUnformatted(name);
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextUnformatted("Undefined");
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.TextDisabled("undefined");
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue