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