From a913baa52461b68cdf6c28aa413e3215ce90a49a Mon Sep 17 00:00:00 2001 From: Lamparter <71598437+Lamparter@users.noreply.github.com> Date: Sat, 18 Jan 2025 17:55:08 +0000 Subject: [PATCH] Move classic mode into separate class --- .../Helpers/ConsoleHelpers.cs | 12 ++ .../InteractiveMode.cs | 179 +++++++++++++++++ src/Riverside.JsonBinder.Console/Program.cs | 185 +----------------- 3 files changed, 192 insertions(+), 184 deletions(-) create mode 100644 src/Riverside.JsonBinder.Console/InteractiveMode.cs diff --git a/src/Riverside.JsonBinder.Console/Helpers/ConsoleHelpers.cs b/src/Riverside.JsonBinder.Console/Helpers/ConsoleHelpers.cs index 6267438..66ac095 100644 --- a/src/Riverside.JsonBinder.Console/Helpers/ConsoleHelpers.cs +++ b/src/Riverside.JsonBinder.Console/Helpers/ConsoleHelpers.cs @@ -34,4 +34,16 @@ public static void PressAnyKey() System.Console.WriteLine("\nPress any key to continue..."); System.Console.ReadKey(); } + + /// + /// Confirms if the user wants to exit the application. + /// + /// True if the user confirms exit, false otherwise. + public static bool ConfirmExit() + { + System.Console.Clear(); + System.Console.Write("Are you sure you want to exit? (y/n): "); + string? confirmation = System.Console.ReadLine()?.Trim().ToLower(); + return confirmation == "y" || confirmation == "yes"; + } } diff --git a/src/Riverside.JsonBinder.Console/InteractiveMode.cs b/src/Riverside.JsonBinder.Console/InteractiveMode.cs new file mode 100644 index 0000000..de85a19 --- /dev/null +++ b/src/Riverside.JsonBinder.Console/InteractiveMode.cs @@ -0,0 +1,179 @@ +using Riverside.JsonBinder.Console.Helpers; +using System.Text.Json; + +namespace Riverside.JsonBinder.Console; + +public class InteractiveMode +{ + private const string CHECKBOX_CHECKED = "[x]"; + private const string CHECKBOX_UNCHECKED = "[ ]"; + + /// + /// Runs the interactive console mode of the application. + /// + public static void Initialize() + { + while (true) + { + DisplayMainMenu(); + string choice = System.Console.ReadLine()?.Trim(); + + switch (choice) + { + case "1": + ConvertJsonToClasses(); + break; + case "2": + DisplayHelp(); + break; + case "3": + if (ConsoleHelpers.ConfirmExit()) + return; + break; + default: + ConsoleHelpers.DisplayRedMessage("Invalid option. Please select a valid menu option.\n"); + break; + } + } + } + + /// + /// Displays the main menu of the application. + /// + private static void DisplayMainMenu() + { + System.Console.Clear(); + System.Console.WriteLine("========================================="); + System.Console.WriteLine(" JSON to Classes Converter"); + System.Console.WriteLine("========================================="); + System.Console.WriteLine("1. Convert JSON to Classes"); + System.Console.WriteLine("2. Help"); + System.Console.WriteLine("3. Exit"); + System.Console.Write("\nSelect an option: "); + } + + + /// + /// Handles the interactive JSON to classes conversion process. + /// + private static void ConvertJsonToClasses() + { + System.Console.Clear(); + System.Console.WriteLine("========================================="); + System.Console.WriteLine(" Convert JSON to Classes"); + System.Console.WriteLine("========================================="); + + System.Console.WriteLine("Enter your JSON (or type 'back' to return to the main menu):"); + string? json = System.Console.ReadLine(); + + if (string.IsNullOrWhiteSpace(json) || string.Equals(json, "back", StringComparison.OrdinalIgnoreCase)) + return; + + var selectedLanguages = SelectLanguages(); + if (selectedLanguages.Count == 0) + { + ConsoleHelpers.DisplayRedMessage("\nNo languages selected. Please try again.\n"); + ConsoleHelpers.PressAnyKey(); + return; + } + + System.Console.Clear(); + System.Console.WriteLine("========================================="); + System.Console.WriteLine(" Generating Classes"); + System.Console.WriteLine("========================================="); + + foreach (var language in selectedLanguages) + { + try + { + string result = JsonSerializer.ConvertTo(json, language); + System.Console.ForegroundColor = ConsoleColor.Green; + System.Console.WriteLine($"\n{language} Classes:\n"); + System.Console.ResetColor(); + System.Console.WriteLine(result); + } + catch (JsonException ex) + { + ConsoleHelpers.DisplayError("Invalid JSON format.", ex.Message); + } + catch (Exception ex) + { + ConsoleHelpers.DisplayError("An unexpected error occurred.", ex.Message); + } + } + + ConsoleHelpers.PressAnyKey(); + } + + /// + /// Displays the help menu. + /// + private static void DisplayHelp() + { + System.Console.Clear(); + System.Console.WriteLine("========================================="); + System.Console.WriteLine(" Help Menu"); + System.Console.WriteLine("========================================="); + System.Console.WriteLine("Interactive Mode:"); + System.Console.WriteLine("1. Input a valid JSON string to generate classes."); + System.Console.WriteLine("2. Use arrow keys to navigate language options."); + System.Console.WriteLine("3. Press SPACE to select/deselect languages."); + System.Console.WriteLine("4. Press ENTER to confirm selections."); + System.Console.WriteLine("\nCommand Line Mode:"); + System.Console.WriteLine("Usage: jsonbinder --lang "); + System.Console.WriteLine("Example: jsonbinder '{\"name\":\"test\"}' --lang csharp,typescript"); + System.Console.WriteLine("\nPress any key to return to the main menu..."); + System.Console.ReadKey(); + } + + /// + /// Displays an interactive language selection interface and returns the selected languages. + /// + /// A list of selected languages. + private static List SelectLanguages() + { + var languages = Enum.GetValues(); + var selected = new HashSet(); + var currentIndex = 0; + + while (true) + { + System.Console.Clear(); + System.Console.WriteLine("\nSelect target languages (use arrow keys to navigate, space to select, enter to confirm):"); + System.Console.WriteLine("Press 'ESC' to cancel selection\n"); + + for (int i = 0; i < languages.Length; i++) + { + var language = languages[i]; + if (i == currentIndex) + System.Console.Write("> "); + else + System.Console.Write(" "); + + System.Console.WriteLine($"{(selected.Contains(language) ? CHECKBOX_CHECKED : CHECKBOX_UNCHECKED)} {language}"); + } + + var key = System.Console.ReadKey(true); + switch (key.Key) + { + case ConsoleKey.UpArrow: + currentIndex = (currentIndex - 1 + languages.Length) % languages.Length; + break; + case ConsoleKey.DownArrow: + currentIndex = (currentIndex + 1) % languages.Length; + break; + case ConsoleKey.Spacebar: + var currentLanguage = languages[currentIndex]; + if (selected.Contains(currentLanguage)) + selected.Remove(currentLanguage); + else + selected.Add(currentLanguage); + break; + case ConsoleKey.Enter: + return selected.ToList(); + case ConsoleKey.Escape: + return new List(); + } + } + } +} diff --git a/src/Riverside.JsonBinder.Console/Program.cs b/src/Riverside.JsonBinder.Console/Program.cs index 8a2fa00..d529ab9 100644 --- a/src/Riverside.JsonBinder.Console/Program.cs +++ b/src/Riverside.JsonBinder.Console/Program.cs @@ -10,9 +10,6 @@ namespace Riverside.JsonBinder.Console; /// public class Program { - private const string CHECKBOX_CHECKED = "[x]"; - private const string CHECKBOX_UNCHECKED = "[ ]"; - /// /// The main entry point for the application. /// @@ -28,7 +25,7 @@ public static int Main(string[] args) var interactiveCommand = new Command("classic", "Enables the classic interactive Json2Any CLI mode") { - Handler = CommandHandler.Create(RunInteractiveMode) + Handler = CommandHandler.Create(InteractiveMode.Initialize) }; rootCommand.AddCommand(interactiveCommand); @@ -37,153 +34,6 @@ public static int Main(string[] args) return rootCommand.InvokeAsync(args).Result; } - /// - /// Runs the interactive console mode of the application. - /// - private static void RunInteractiveMode() - { - while (true) - { - DisplayMainMenu(); - string choice = System.Console.ReadLine()?.Trim(); - - switch (choice) - { - case "1": - ConvertJsonToClassesInteractive(); - break; - case "2": - DisplayHelp(); - break; - case "3": - if (ConfirmExit()) - return; - break; - default: - ConsoleHelpers.DisplayRedMessage("Invalid option. Please select a valid menu option.\n"); - break; - } - } - } - - /// - /// Displays the main menu of the application. - /// - private static void DisplayMainMenu() - { - System.Console.Clear(); - System.Console.WriteLine("========================================="); - System.Console.WriteLine(" JSON to Classes Converter"); - System.Console.WriteLine("========================================="); - System.Console.WriteLine("1. Convert JSON to Classes"); - System.Console.WriteLine("2. Help"); - System.Console.WriteLine("3. Exit"); - System.Console.Write("\nSelect an option: "); - } - - /// - /// Handles the interactive JSON to classes conversion process. - /// - private static void ConvertJsonToClassesInteractive() - { - System.Console.Clear(); - System.Console.WriteLine("========================================="); - System.Console.WriteLine(" Convert JSON to Classes"); - System.Console.WriteLine("========================================="); - - System.Console.WriteLine("Enter your JSON (or type 'back' to return to the main menu):"); - string? json = System.Console.ReadLine(); - - if (string.IsNullOrWhiteSpace(json) || string.Equals(json, "back", StringComparison.OrdinalIgnoreCase)) - return; - - var selectedLanguages = SelectLanguagesInteractive(); - if (selectedLanguages.Count == 0) - { - ConsoleHelpers.DisplayRedMessage("\nNo languages selected. Please try again.\n"); - ConsoleHelpers.PressAnyKey(); - return; - } - - System.Console.Clear(); - System.Console.WriteLine("========================================="); - System.Console.WriteLine(" Generating Classes"); - System.Console.WriteLine("========================================="); - - foreach (var language in selectedLanguages) - { - try - { - string result = JsonSerializer.ConvertTo(json, language); - System.Console.ForegroundColor = ConsoleColor.Green; - System.Console.WriteLine($"\n{language} Classes:\n"); - System.Console.ResetColor(); - System.Console.WriteLine(result); - } - catch (JsonException ex) - { - ConsoleHelpers.DisplayError("Invalid JSON format.", ex.Message); - } - catch (Exception ex) - { - ConsoleHelpers.DisplayError("An unexpected error occurred.", ex.Message); - } - } - - ConsoleHelpers.PressAnyKey(); - } - - /// - /// Displays an interactive language selection interface and returns the selected languages. - /// - /// A list of selected languages. - private static List SelectLanguagesInteractive() - { - var languages = Enum.GetValues(); - var selected = new HashSet(); - var currentIndex = 0; - - while (true) - { - System.Console.Clear(); - System.Console.WriteLine("\nSelect target languages (use arrow keys to navigate, space to select, enter to confirm):"); - System.Console.WriteLine("Press 'ESC' to cancel selection\n"); - - for (int i = 0; i < languages.Length; i++) - { - var language = languages[i]; - if (i == currentIndex) - System.Console.Write("> "); - else - System.Console.Write(" "); - - System.Console.WriteLine($"{(selected.Contains(language) ? CHECKBOX_CHECKED : CHECKBOX_UNCHECKED)} {language}"); - } - - var key = System.Console.ReadKey(true); - switch (key.Key) - { - case ConsoleKey.UpArrow: - currentIndex = (currentIndex - 1 + languages.Length) % languages.Length; - break; - case ConsoleKey.DownArrow: - currentIndex = (currentIndex + 1) % languages.Length; - break; - case ConsoleKey.Spacebar: - var currentLanguage = languages[currentIndex]; - if (selected.Contains(currentLanguage)) - selected.Remove(currentLanguage); - else - selected.Add(currentLanguage); - break; - case ConsoleKey.Enter: - return selected.ToList(); - case ConsoleKey.Escape: - return new List(); - } - } - } - /// /// Converts the provided JSON string to classes in the specified languages (CLI mode). /// @@ -228,37 +78,4 @@ private static void ConvertJsonToClasses(string json, string[] languages) } } } - - /// - /// Displays the help menu. - /// - private static void DisplayHelp() - { - System.Console.Clear(); - System.Console.WriteLine("========================================="); - System.Console.WriteLine(" Help Menu"); - System.Console.WriteLine("========================================="); - System.Console.WriteLine("Interactive Mode:"); - System.Console.WriteLine("1. Input a valid JSON string to generate classes."); - System.Console.WriteLine("2. Use arrow keys to navigate language options."); - System.Console.WriteLine("3. Press SPACE to select/deselect languages."); - System.Console.WriteLine("4. Press ENTER to confirm selections."); - System.Console.WriteLine("\nCommand Line Mode:"); - System.Console.WriteLine("Usage: jsonbinder --lang "); - System.Console.WriteLine("Example: jsonbinder '{\"name\":\"test\"}' --lang csharp,typescript"); - System.Console.WriteLine("\nPress any key to return to the main menu..."); - System.Console.ReadKey(); - } - - /// - /// Confirms if the user wants to exit the application. - /// - /// True if the user confirms exit, false otherwise. - private static bool ConfirmExit() - { - System.Console.Clear(); - System.Console.Write("Are you sure you want to exit? (y/n): "); - string? confirmation = System.Console.ReadLine()?.Trim().ToLower(); - return confirmation == "y" || confirmation == "yes"; - } } \ No newline at end of file