Skip to content

Commit a913baa

Browse files
committed
Move classic mode into separate class
1 parent 03ac8ce commit a913baa

File tree

3 files changed

+192
-184
lines changed

3 files changed

+192
-184
lines changed

src/Riverside.JsonBinder.Console/Helpers/ConsoleHelpers.cs

+12
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,16 @@ public static void PressAnyKey()
3434
System.Console.WriteLine("\nPress any key to continue...");
3535
System.Console.ReadKey();
3636
}
37+
38+
/// <summary>
39+
/// Confirms if the user wants to exit the application.
40+
/// </summary>
41+
/// <returns>True if the user confirms exit, false otherwise.</returns>
42+
public static bool ConfirmExit()
43+
{
44+
System.Console.Clear();
45+
System.Console.Write("Are you sure you want to exit? (y/n): ");
46+
string? confirmation = System.Console.ReadLine()?.Trim().ToLower();
47+
return confirmation == "y" || confirmation == "yes";
48+
}
3749
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
using Riverside.JsonBinder.Console.Helpers;
2+
using System.Text.Json;
3+
4+
namespace Riverside.JsonBinder.Console;
5+
6+
public class InteractiveMode
7+
{
8+
private const string CHECKBOX_CHECKED = "[x]";
9+
private const string CHECKBOX_UNCHECKED = "[ ]";
10+
11+
/// <summary>
12+
/// Runs the interactive console mode of the application.
13+
/// </summary>
14+
public static void Initialize()
15+
{
16+
while (true)
17+
{
18+
DisplayMainMenu();
19+
string choice = System.Console.ReadLine()?.Trim();
20+
21+
switch (choice)
22+
{
23+
case "1":
24+
ConvertJsonToClasses();
25+
break;
26+
case "2":
27+
DisplayHelp();
28+
break;
29+
case "3":
30+
if (ConsoleHelpers.ConfirmExit())
31+
return;
32+
break;
33+
default:
34+
ConsoleHelpers.DisplayRedMessage("Invalid option. Please select a valid menu option.\n");
35+
break;
36+
}
37+
}
38+
}
39+
40+
/// <summary>
41+
/// Displays the main menu of the application.
42+
/// </summary>
43+
private static void DisplayMainMenu()
44+
{
45+
System.Console.Clear();
46+
System.Console.WriteLine("=========================================");
47+
System.Console.WriteLine(" JSON to Classes Converter");
48+
System.Console.WriteLine("=========================================");
49+
System.Console.WriteLine("1. Convert JSON to Classes");
50+
System.Console.WriteLine("2. Help");
51+
System.Console.WriteLine("3. Exit");
52+
System.Console.Write("\nSelect an option: ");
53+
}
54+
55+
56+
/// <summary>
57+
/// Handles the interactive JSON to classes conversion process.
58+
/// </summary>
59+
private static void ConvertJsonToClasses()
60+
{
61+
System.Console.Clear();
62+
System.Console.WriteLine("=========================================");
63+
System.Console.WriteLine(" Convert JSON to Classes");
64+
System.Console.WriteLine("=========================================");
65+
66+
System.Console.WriteLine("Enter your JSON (or type 'back' to return to the main menu):");
67+
string? json = System.Console.ReadLine();
68+
69+
if (string.IsNullOrWhiteSpace(json) || string.Equals(json, "back", StringComparison.OrdinalIgnoreCase))
70+
return;
71+
72+
var selectedLanguages = SelectLanguages();
73+
if (selectedLanguages.Count == 0)
74+
{
75+
ConsoleHelpers.DisplayRedMessage("\nNo languages selected. Please try again.\n");
76+
ConsoleHelpers.PressAnyKey();
77+
return;
78+
}
79+
80+
System.Console.Clear();
81+
System.Console.WriteLine("=========================================");
82+
System.Console.WriteLine(" Generating Classes");
83+
System.Console.WriteLine("=========================================");
84+
85+
foreach (var language in selectedLanguages)
86+
{
87+
try
88+
{
89+
string result = JsonSerializer.ConvertTo(json, language);
90+
System.Console.ForegroundColor = ConsoleColor.Green;
91+
System.Console.WriteLine($"\n{language} Classes:\n");
92+
System.Console.ResetColor();
93+
System.Console.WriteLine(result);
94+
}
95+
catch (JsonException ex)
96+
{
97+
ConsoleHelpers.DisplayError("Invalid JSON format.", ex.Message);
98+
}
99+
catch (Exception ex)
100+
{
101+
ConsoleHelpers.DisplayError("An unexpected error occurred.", ex.Message);
102+
}
103+
}
104+
105+
ConsoleHelpers.PressAnyKey();
106+
}
107+
108+
/// <summary>
109+
/// Displays the help menu.
110+
/// </summary>
111+
private static void DisplayHelp()
112+
{
113+
System.Console.Clear();
114+
System.Console.WriteLine("=========================================");
115+
System.Console.WriteLine(" Help Menu");
116+
System.Console.WriteLine("=========================================");
117+
System.Console.WriteLine("Interactive Mode:");
118+
System.Console.WriteLine("1. Input a valid JSON string to generate classes.");
119+
System.Console.WriteLine("2. Use arrow keys to navigate language options.");
120+
System.Console.WriteLine("3. Press SPACE to select/deselect languages.");
121+
System.Console.WriteLine("4. Press ENTER to confirm selections.");
122+
System.Console.WriteLine("\nCommand Line Mode:");
123+
System.Console.WriteLine("Usage: jsonbinder <json> --lang <languages>");
124+
System.Console.WriteLine("Example: jsonbinder '{\"name\":\"test\"}' --lang csharp,typescript");
125+
System.Console.WriteLine("\nPress any key to return to the main menu...");
126+
System.Console.ReadKey();
127+
}
128+
129+
/// <summary>
130+
/// Displays an interactive language selection interface and returns the selected languages.
131+
/// </summary>
132+
/// <returns>A list of selected languages.</returns>
133+
private static List<SerializableLanguage> SelectLanguages()
134+
{
135+
var languages = Enum.GetValues<SerializableLanguage>();
136+
var selected = new HashSet<SerializableLanguage>();
137+
var currentIndex = 0;
138+
139+
while (true)
140+
{
141+
System.Console.Clear();
142+
System.Console.WriteLine("\nSelect target languages (use arrow keys to navigate, space to select, enter to confirm):");
143+
System.Console.WriteLine("Press 'ESC' to cancel selection\n");
144+
145+
for (int i = 0; i < languages.Length; i++)
146+
{
147+
var language = languages[i];
148+
if (i == currentIndex)
149+
System.Console.Write("> ");
150+
else
151+
System.Console.Write(" ");
152+
153+
System.Console.WriteLine($"{(selected.Contains(language) ? CHECKBOX_CHECKED : CHECKBOX_UNCHECKED)} {language}");
154+
}
155+
156+
var key = System.Console.ReadKey(true);
157+
switch (key.Key)
158+
{
159+
case ConsoleKey.UpArrow:
160+
currentIndex = (currentIndex - 1 + languages.Length) % languages.Length;
161+
break;
162+
case ConsoleKey.DownArrow:
163+
currentIndex = (currentIndex + 1) % languages.Length;
164+
break;
165+
case ConsoleKey.Spacebar:
166+
var currentLanguage = languages[currentIndex];
167+
if (selected.Contains(currentLanguage))
168+
selected.Remove(currentLanguage);
169+
else
170+
selected.Add(currentLanguage);
171+
break;
172+
case ConsoleKey.Enter:
173+
return selected.ToList();
174+
case ConsoleKey.Escape:
175+
return new List<SerializableLanguage>();
176+
}
177+
}
178+
}
179+
}

0 commit comments

Comments
 (0)