From b2ab434ec37f67b1ef9f0f99e7d2f11e3c34defa Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Thu, 18 Jul 2024 10:59:36 -0700 Subject: [PATCH] json to Markdown --- .vscode/launch.json | 17 ++++-- Day/2024-Q3/Helper-2024-07-18.cs | 101 +++++++++++++++++++++++++++++++ Day/HelperDay.cs | 2 + 3 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 Day/2024-Q3/Helper-2024-07-18.cs diff --git a/.vscode/launch.json b/.vscode/launch.json index 4e2b1e0..6cbc81b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,12 +12,17 @@ "program": "${workspaceFolder}/bin/Debug/net8.0/win-x64/File-Folder-Helper.dll", "args": [ "s", - "M", - "L:/Git/Notes-Infineon/.Infineon", - "-d", - "L:/Git/Notes-Infineon/.Infineon/.vscode/helper", - "-u", - "true" + "X", + "L:/Git/Notes-Network/.Network/.vscode/helper", + "Day-Helper-2024-07-18", + "hosts.jsonl", + "192.168.0.", + "Network", + "Wired", + ".md", + "7777", + "8888", + "9999" ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", diff --git a/Day/2024-Q3/Helper-2024-07-18.cs b/Day/2024-Q3/Helper-2024-07-18.cs new file mode 100644 index 0000000..416307a --- /dev/null +++ b/Day/2024-Q3/Helper-2024-07-18.cs @@ -0,0 +1,101 @@ +using Microsoft.Extensions.Logging; +using System.Collections.ObjectModel; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace File_Folder_Helper.Day; + +internal static partial class Helper20240718 +{ + + private record Host([property: JsonPropertyName("a")] string? Id, + [property: JsonPropertyName("b")] string? Colon, + [property: JsonPropertyName("c")] string? Hyphen, + [property: JsonPropertyName("d")] string? Line, + [property: JsonPropertyName("e")] string? Count, + [property: JsonPropertyName("f")] string? Segments, + [property: JsonPropertyName("g")] string? Type, + [property: JsonPropertyName("h")] string? Device, + [property: JsonPropertyName("i")] string? Name); + + [JsonSourceGenerationOptions(WriteIndented = true, AllowTrailingCommas = true)] + [JsonSerializable(typeof(Host[]))] + private partial class HostBSourceGenerationContext : JsonSerializerContext + { + } + + private record Record(string Key, Dictionary KeyValuePairs); + + [JsonSourceGenerationOptions(WriteIndented = true)] + [JsonSerializable(typeof(Dictionary>))] + private partial class DictionaryDictionaryBSourceGenerationContext : JsonSerializerContext + { + } + + private static Host[] GetHosts(ILogger logger, string file) + { + Host[] results; + string lines = File.ReadAllText(file); + string json = $"[{lines.Replace("\r\n", ",")}]"; + logger.LogDebug(lines); + JsonSerializerOptions jsonSerializerOptions = new() { AllowTrailingCommas = true }; + results = JsonSerializer.Deserialize(json, jsonSerializerOptions) ?? throw new NullReferenceException(); + return results; + } + + private static ReadOnlyCollection GetLines(Host[] hosts, string argsIP, string title, string wired) + { + List results = ["flowchart LR", $" subgraph {title}"]; + int id; + string line; + string check; + List distinct = []; + string newLine = $"{Environment.NewLine} "; + foreach (Host host in hosts) + { + if (host.Id is null || host.Hyphen is null || host.Device is null || host.Name is null || host.Hyphen.Length != 17) + continue; + if (!int.TryParse(host.Id, out id)) + throw new NotSupportedException($"{host.Id} is not a number"); + if (distinct.Contains(id)) + throw new NotSupportedException($"{id} is not distinct!"); + distinct.Add(id); + line = $"{id}(fa:{host.Type}{newLine}{host.Name}{newLine}{host.Colon}{newLine}{host.Hyphen}{newLine}{host.Device}{newLine}https://{host.Name}/)"; + results.Add(line); + } + results.Add(" end"); + results.Add($" subgraph {title}"); + foreach (Host host in hosts) + { + if (host.Id is null || host.Hyphen is null || host.Device is null || host.Name is null || host.Hyphen.Length != 17) + continue; + if (!int.TryParse(host.Id, out id)) + throw new NotSupportedException($"{host.Id} is not a number"); + check = host.Type == wired ? "-->" : "-.->"; + line = $"{id} {check} {argsIP}{host.Line}"; + results.Add(line); + } + results.Add(" end"); + return results.AsReadOnly(); + } + + internal static void JsonToMarkdown(ILogger logger, List args) + { + Host[] hosts; + string title = args[4]; + string wired = args[5]; + string argsIP = args[3]; + string extension = args[6]; + string searchPattern = args[2]; + ReadOnlyCollection lines; + string sourceDirectory = Path.GetFullPath(args[0]); + string[] files = Directory.GetFiles(sourceDirectory, searchPattern, SearchOption.TopDirectoryOnly); + foreach (string file in files) + { + hosts = GetHosts(logger, file); + lines = GetLines(hosts, argsIP, title, wired); + File.WriteAllText($"{file}{extension}", string.Join(Environment.NewLine, lines)); + } + } + +} \ No newline at end of file diff --git a/Day/HelperDay.cs b/Day/HelperDay.cs index 21ce8f9..0050ea6 100644 --- a/Day/HelperDay.cs +++ b/Day/HelperDay.cs @@ -79,6 +79,8 @@ internal static class HelperDay Day.Helper20240624.MoveUpOneDirectory(logger, args); else if (args[1] == "Day-Helper-2024-07-11") Day.Helper20240711.GitRemoteRemove(logger, args); + else if (args[1] == "Day-Helper-2024-07-18") + Day.Helper20240718.JsonToMarkdown(logger, args); else throw new Exception(appSettings.Company); }