diff --git a/ComfySharp/ComfyClient.cs b/ComfySharp/ComfyClient.cs index c849aec..c493e15 100644 --- a/ComfySharp/ComfyClient.cs +++ b/ComfySharp/ComfyClient.cs @@ -1,9 +1,8 @@ using System.ComponentModel.DataAnnotations; using System.Net; using System.Net.Http.Json; -using System.Runtime.Serialization; using System.Text.Json; -using System.Text.Json.Serialization; +using ComfySharp.Types; namespace ComfySharp; @@ -49,15 +48,11 @@ public class ComfyClient { if (req is { IsSuccessStatusCode: true, Content: not null }) { var doc = await req.Content.ReadFromJsonAsync(); + ObjectInfoParser.Parse(doc, out nodes); - foreach (var node in doc.RootElement.EnumerateObject()) { - Node n; - - - } } - return null; + throw new NotImplementedException(); } public async Task GetImage(string filename) { @@ -67,103 +62,4 @@ public class ComfyClient { return await req.Content.ReadFromJsonAsync(); return null; } -} - -[DataContract, JsonSerializable(typeof(Node))] -public class Node { - [DataMember(Name = "name")] - public string Name { get; set; } - [DataMember(Name = "input")] - public Input Input { get; set; } - [DataMember(Name = "output")] - public List Outputs { get; set; } - [DataMember(Name = "output_is_list")] - public List OutputIsList { get; set; } - [DataMember(Name = "output_name")] - public List OutputNames { get; set; } - [DataMember(Name = "display_name")] - public string DisplayName { get; set; } - [DataMember(Name = "description")] - public string Description { get; set; } - [DataMember(Name = "category")] - public string Category { get; set; } - [DataMember(Name = "output_node")] - public bool IsOutputNode { get; set; } - - public Node() { - Name = ""; - Input = new(); - Outputs = new(); - OutputIsList = new(); - OutputNames = new(); - DisplayName = ""; - Description = ""; - Category = ""; - IsOutputNode = false; - } -} - -[DataContract] -public struct Input { - [DataMember] - public List Required { get; set; } - [DataMember] - public List Optional { get; set; } - [DataMember] - public List Hidden { get; set; } - - public Input() { - Required = new(); - Optional = new(); - Hidden = new(); - } -} - -public struct InputField { - [DataMember(Name = "name")] - public string Name { get; set; } - - public PrimitiveType Type { get; set; } -} - -public enum PrimitiveType { - ANY, - CLIP, - CLIP_VISION, - CLIP_VISION_OUTPUT, - CONDITIONING, - CONTROL_NET, - EXTRA_PNGINFO, - FLOAT, - GLIGEN, - IMAGE, - INT, - LATENT, - MASK, - MODEL, - PROMPT, - SAMPLER, - SIGMAS, - STRING, - STYLE_MODEL, - UNIQUE_ID, - UPSCALE_MODEL, - VAE, -} - -[DataContract, JsonSerializable(typeof(ImageInfo))] -public class ImageInfo { - [DataMember(Name = "name")] - public string Name { get; set; } - [DataMember(Name = "subfolder")] - public string Subfolder { get; set; } - [DataMember(Name = "type")] - public DirType Type { get; set; } -} - -[DataContract] -public enum DirType { - [DataMember(Name = "input")] Input, - [DataMember(Name = "temp")] Temp, - [DataMember(Name = "output")] Output } \ No newline at end of file diff --git a/ComfySharp/ObjectInfoParser.cs b/ComfySharp/ObjectInfoParser.cs new file mode 100644 index 0000000..1f5580a --- /dev/null +++ b/ComfySharp/ObjectInfoParser.cs @@ -0,0 +1,83 @@ +using System.Text.Json; +using ComfySharp.Types; + +namespace ComfySharp; + +public static class ObjectInfoParser { + public static void Parse(JsonDocument document, out List nodes) { + nodes = new List(); + foreach (var node in document.RootElement.EnumerateObject()) { + Node n = new(); + n.Name = node.Name; + + foreach (var prop in node.Value.EnumerateObject()) { + switch (prop.Name) { + case "input": + n.Input = new(); + + foreach (var input in prop.Value.EnumerateObject()) { + switch (input.Name) { + case "required": + foreach (var field in input.Value.EnumerateObject()) { + InputField f = new(); + f.Name = field.Name; + f.Type = Enum.Parse(field.Value.GetString() ?? ""); + n.Input.Required.Add(f); + } + break; + case "optional": + foreach (var field in input.Value.EnumerateObject()) { + InputField f = new(); + f.Name = field.Name; + f.Type = Enum.Parse(field.Value.GetString() ?? ""); + n.Input.Optional.Add(f); + } + break; + case "hidden": + foreach (var field in input.Value.EnumerateObject()) { + InputField f = new(); + f.Name = field.Name; + f.Type = Enum.Parse(field.Value.GetString() ?? ""); + n.Input.Hidden.Add(f); + } + break; + } + } + break; + case "output": + foreach (var output in prop.Value.EnumerateObject()) { + n.Outputs.Add(Enum.Parse(output.Value.GetString() ?? "")); + n.OutputIsList.Add(output.Value.GetBoolean()); + n.OutputNames.Add(output.Name); + } + break; + case "display_name": + n.DisplayName = prop.Value.GetString() ?? ""; + break; + case "description": + n.Description = prop.Value.GetString() ?? ""; + break; + case "category": + n.Category = prop.Value.GetString() ?? ""; + break; + case "output_node": + n.IsOutputNode = prop.Value.GetBoolean(); + break; + } + } + } + } + + private static void ParseNode(JsonElement node, out Node n) { + n = new(); + n.Name = node.GetProperty("name").GetString() ?? ""; + n.Input = ParseInput(node.GetProperty("input")); + n.Outputs = ParseOutputs(node.GetProperty("output")); + n.OutputIsList = ParseOutputIsList(node.GetProperty("output")); + n.OutputNames = ParseOutputNames(node.GetProperty("output")); + n.DisplayName = node.GetProperty("display_name").GetString() ?? ""; + n.Description = node.GetProperty("description").GetString() ?? ""; + n.Category = node.GetProperty("category").GetString() ?? ""; + n.IsOutputNode = node.GetProperty("output_node").GetBoolean(); + } +} \ No newline at end of file diff --git a/ComfySharp/Types/DirType.cs b/ComfySharp/Types/DirType.cs new file mode 100644 index 0000000..1f7e117 --- /dev/null +++ b/ComfySharp/Types/DirType.cs @@ -0,0 +1,10 @@ +using System.Runtime.Serialization; + +namespace ComfySharp.Types; + +[DataContract] +public enum DirType { + [DataMember(Name = "input")] Input, + [DataMember(Name = "temp")] Temp, + [DataMember(Name = "output")] Output +} \ No newline at end of file diff --git a/ComfySharp/Types/ImageInfo.cs b/ComfySharp/Types/ImageInfo.cs new file mode 100644 index 0000000..55e821b --- /dev/null +++ b/ComfySharp/Types/ImageInfo.cs @@ -0,0 +1,14 @@ +using System.Runtime.Serialization; +using System.Text.Json.Serialization; + +namespace ComfySharp.Types; + +[DataContract, JsonSerializable(typeof(ImageInfo))] +public class ImageInfo { + [DataMember(Name = "name")] + public string Name { get; set; } + [DataMember(Name = "subfolder")] + public string Subfolder { get; set; } + [DataMember(Name = "type")] + public DirType Type { get; set; } +} \ No newline at end of file diff --git a/ComfySharp/Types/Input.cs b/ComfySharp/Types/Input.cs new file mode 100644 index 0000000..a19213d --- /dev/null +++ b/ComfySharp/Types/Input.cs @@ -0,0 +1,19 @@ +using System.Runtime.Serialization; + +namespace ComfySharp.Types; + +[DataContract] +public struct Input { + [DataMember] + public List Required { get; set; } + [DataMember] + public List Optional { get; set; } + [DataMember] + public List Hidden { get; set; } + + public Input() { + Required = new(); + Optional = new(); + Hidden = new(); + } +} \ No newline at end of file diff --git a/ComfySharp/Types/InputField.cs b/ComfySharp/Types/InputField.cs new file mode 100644 index 0000000..2979db8 --- /dev/null +++ b/ComfySharp/Types/InputField.cs @@ -0,0 +1,10 @@ +using System.Runtime.Serialization; + +namespace ComfySharp.Types; + +public struct InputField { + [DataMember(Name = "name")] + public string Name { get; set; } + + public PrimitiveType Type { get; set; } +} \ No newline at end of file diff --git a/ComfySharp/Types/Node.cs b/ComfySharp/Types/Node.cs new file mode 100644 index 0000000..011b0d4 --- /dev/null +++ b/ComfySharp/Types/Node.cs @@ -0,0 +1,38 @@ +using System.Runtime.Serialization; +using System.Text.Json.Serialization; + +namespace ComfySharp.Types; + +[DataContract, JsonSerializable(typeof(Node))] +public class Node { + [DataMember(Name = "name")] + public string Name { get; set; } + [DataMember(Name = "input")] + public Input Input { get; set; } + [DataMember(Name = "output")] + public List Outputs { get; set; } + [DataMember(Name = "output_is_list")] + public List OutputIsList { get; set; } + [DataMember(Name = "output_name")] + public List OutputNames { get; set; } + [DataMember(Name = "display_name")] + public string DisplayName { get; set; } + [DataMember(Name = "description")] + public string Description { get; set; } + [DataMember(Name = "category")] + public string Category { get; set; } + [DataMember(Name = "output_node")] + public bool IsOutputNode { get; set; } + + public Node() { + Name = ""; + Input = new(); + Outputs = new(); + OutputIsList = new(); + OutputNames = new(); + DisplayName = ""; + Description = ""; + Category = ""; + IsOutputNode = false; + } +} \ No newline at end of file diff --git a/ComfySharp/Types/PrimitiveType.cs b/ComfySharp/Types/PrimitiveType.cs new file mode 100644 index 0000000..ccd7287 --- /dev/null +++ b/ComfySharp/Types/PrimitiveType.cs @@ -0,0 +1,26 @@ +namespace ComfySharp.Types; + +public enum PrimitiveType { + ANY, + CLIP, + CLIP_VISION, + CLIP_VISION_OUTPUT, + CONDITIONING, + CONTROL_NET, + EXTRA_PNGINFO, + FLOAT, + GLIGEN, + IMAGE, + INT, + LATENT, + MASK, + MODEL, + PROMPT, + SAMPLER, + SIGMAS, + STRING, + STYLE_MODEL, + UNIQUE_ID, + UPSCALE_MODEL, + VAE, +} \ No newline at end of file