Skip to content

Commit e0b4a56

Browse files
authored
Merge pull request #9 from InEngine-NET/feature/add_async_console_writes
Add async console write methods
2 parents aa800c6 + 5b94f00 commit e0b4a56

File tree

8 files changed

+154
-85
lines changed

8 files changed

+154
-85
lines changed

src/InEngine.Commands/AlwaysFail.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
using System.Threading.Tasks;
2+
using System;
23
using InEngine.Core;
34
using InEngine.Core.Exceptions;
45

src/InEngine.Core/AbstractCommand.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ public virtual void Run()
4444
{
4545
}
4646

47-
public virtual async Task RunAsync() => await Task.Run(Run).ConfigureAwait(false);
47+
public virtual async Task RunAsync()
48+
{
49+
Run();
50+
await Task.CompletedTask;
51+
}
4852

4953
public virtual async Task RunWithLifeCycle()
5054
{
@@ -110,18 +114,38 @@ public virtual async Task Execute(IJobExecutionContext context)
110114

111115
#endregion
112116

113-
#region Console output
117+
#region Console Output
114118

115119
public IConsoleWrite Info(object val) => Write.Info(val);
116120
public IConsoleWrite Warning(object val) => Write.Warning(val);
117121
public IConsoleWrite Error(object val) => Write.Error(val);
118122
public IConsoleWrite Line(object val) => Write.Line(val);
119-
public IConsoleWrite ColoredLine(object val, ConsoleColor consoleColor) => Write.ColoredLine(val, consoleColor);
123+
public IConsoleWrite LineWithColor(object val, ConsoleColor consoleColor) => Write.LineWithColor(val, consoleColor);
120124
public IConsoleWrite InfoText(object val) => Write.InfoText(val);
121125
public IConsoleWrite WarningText(object val) => Write.WarningText(val);
122126
public IConsoleWrite ErrorText(object val) => Write.ErrorText(val);
123127
public IConsoleWrite Text(object val) => Write.Text(val);
124-
public IConsoleWrite ColoredText(object val, ConsoleColor consoleColor) => Write.ColoredText(val, consoleColor);
128+
129+
public IConsoleWrite TextWithColor(object val, ConsoleColor consoleColor, bool writeLine) =>
130+
Write.TextWithColor(val, consoleColor, writeLine);
131+
132+
public async Task NewlineAsync(int count = 1) => await Write.NewlineAsync(count);
133+
public async Task InfoAsync(object val) => await Write.InfoAsync(val);
134+
public async Task WarningAsync(object val) => await Write.WarningAsync(val);
135+
public async Task ErrorAsync(object val) => await Write.ErrorAsync(val);
136+
public async Task LineAsync(object val) => await Write.LineAsync(val);
137+
138+
public async Task LineWithColorAsync(object val, ConsoleColor consoleColor) =>
139+
await Write.LineWithColorAsync(val, consoleColor);
140+
141+
public async Task InfoTextAsync(object val) => await Write.InfoTextAsync(val);
142+
public async Task WarningTextAsync(object val) => await Write.WarningTextAsync(val);
143+
public async Task ErrorTextAsync(object val) => await Write.ErrorTextAsync(val);
144+
public async Task TextAsync(object val) => await Write.TextAsync(val);
145+
146+
public async Task TextWithColorAsync(object val, ConsoleColor consoleColor, bool writeLine = false) =>
147+
await Write.TextWithColorAsync(val, consoleColor, writeLine);
148+
125149
public IConsoleWrite Newline(int count = 1) => Write.Newline(count);
126150
public string FlushBuffer() => Write.FlushBuffer();
127151
public void ToFile(string path, string text, bool shouldAppend = false) => Write.ToFile(path, text, shouldAppend);

src/InEngine.Core/Commands/CommandsPlugin.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ public class CommandPlugin : AbstractPlugin
99

1010
[VerbOption("exec", HelpText = "Execute an external program.")]
1111
public Exec Exec { get; set; }
12+
13+
[VerbOption("sleep", HelpText = "Sleep (in seconds)")]
14+
public Sleep Sleep { get; set; }
1215
}

src/InEngine.Core/Commands/Echo.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using CommandLine;
1+
using System;
2+
using System.Threading.Tasks;
3+
using CommandLine;
24

35
namespace InEngine.Core.Commands;
46

@@ -16,5 +18,5 @@ public Echo()
1618
[Option("text", HelpText = "The text to echo.")]
1719
public string VerbatimText { get; init; }
1820

19-
public override void Run() => Line(VerbatimText);
21+
public override async Task RunAsync() => await LineAsync(VerbatimText);
2022
}

src/InEngine.Core/Commands/Sleep.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33

44
namespace InEngine.Core.Commands;
55

6+
using CommandLine;
7+
68
public class Sleep : AbstractCommand
79
{
8-
public int MillisecondsTimeout { get; set; }
10+
[Option("duration", HelpText = "The number of seconds to sleep.")]
11+
public int DurationInSeconds { get; set; }
912

10-
public override void Run()
13+
public override async Task RunAsync()
1114
{
12-
Warning("Going to sleep...");
13-
Thread.Sleep(MillisecondsTimeout);
14-
Info("Done sleeping!");
15+
await WarningAsync("Going to sleep...");
16+
Thread.Sleep(DurationInSeconds * 1000);
17+
await InfoAsync("Done sleeping!");
1518
}
1619
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System;
2+
3+
namespace InEngine.Core.IO;
4+
5+
using System.Threading.Tasks;
6+
7+
public interface IConsoleWrite
8+
{
9+
#region Sync Methods
10+
11+
IConsoleWrite Newline(int count = 1);
12+
IConsoleWrite Info(object val);
13+
IConsoleWrite Warning(object val);
14+
IConsoleWrite Error(object val);
15+
IConsoleWrite Line(object val);
16+
IConsoleWrite LineWithColor(object val, ConsoleColor consoleColor);
17+
18+
IConsoleWrite InfoText(object val);
19+
IConsoleWrite WarningText(object val);
20+
IConsoleWrite ErrorText(object val);
21+
IConsoleWrite Text(object val);
22+
IConsoleWrite TextWithColor(object val, ConsoleColor consoleColor, bool writeLine = false);
23+
24+
#endregion
25+
26+
#region Async Methods
27+
28+
Task NewlineAsync(int count = 1);
29+
Task InfoAsync(object val);
30+
Task WarningAsync(object val);
31+
Task ErrorAsync(object val);
32+
Task LineAsync(object val);
33+
Task LineWithColorAsync(object val, ConsoleColor consoleColor);
34+
35+
Task InfoTextAsync(object val);
36+
Task WarningTextAsync(object val);
37+
Task ErrorTextAsync(object val);
38+
Task TextAsync(object val);
39+
Task TextWithColorAsync(object val, ConsoleColor consoleColor, bool writeLine = false);
40+
41+
#endregion
42+
43+
string FlushBuffer();
44+
void ToFile(string path, string text, bool shouldAppend = false);
45+
}

src/InEngine.Core/IO/IWrite.cs

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/InEngine.Core/IO/Write.cs

Lines changed: 64 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,29 @@
22
using System.Collections.Generic;
33
using System.IO;
44
using System.Threading;
5+
using System.Threading.Tasks;
56

67
namespace InEngine.Core.IO;
78

89
public class Write : IConsoleWrite
910
{
10-
static readonly Mutex consoleOutputLock = new Mutex();
11-
static readonly Mutex fileOutputLock = new Mutex();
11+
private static readonly Mutex ConsoleOutputLock = new();
12+
public static readonly Mutex FileOutputLock = new();
1213

1314
public ConsoleColor InfoColor { get; set; } = ConsoleColor.Green;
1415
public ConsoleColor WarningColor { get; set; } = ConsoleColor.Yellow;
1516
public ConsoleColor ErrorColor { get; set; } = ConsoleColor.Red;
1617
public ConsoleColor LineColor { get; set; } = ConsoleColor.White;
17-
public List<string> Buffer { get; set; } = new List<string>();
18+
public List<string> Buffer { get; set; } = new();
1819
public bool IsBufferEnabled { get; set; }
1920

2021
public Write() : this(true)
2122
{
2223
}
2324

24-
public Write(bool isBufferEnabled)
25-
{
26-
IsBufferEnabled = isBufferEnabled;
27-
}
25+
public Write(bool isBufferEnabled) => IsBufferEnabled = isBufferEnabled;
26+
27+
#region Sync Methods
2828

2929
public IConsoleWrite Newline(int count = 1)
3030
{
@@ -33,77 +33,90 @@ public IConsoleWrite Newline(int count = 1)
3333
return this;
3434
}
3535

36-
public IConsoleWrite Info(object val)
37-
{
38-
return ColoredLine(val, InfoColor);
39-
}
36+
public IConsoleWrite Info(object val) => LineWithColor(val, InfoColor);
37+
public IConsoleWrite Error(object val) => LineWithColor(val, ErrorColor);
38+
public IConsoleWrite Warning(object val) => LineWithColor(val, WarningColor);
39+
public IConsoleWrite Line(object val) => LineWithColor(val, LineColor);
4040

41-
public IConsoleWrite Error(object val)
41+
public IConsoleWrite LineWithColor(object val, ConsoleColor consoleColor)
4242
{
43-
return ColoredLine(val, ErrorColor);
43+
TextWithColor(val, consoleColor, true);
44+
return this;
4445
}
4546

46-
public IConsoleWrite Warning(object val)
47-
{
48-
return ColoredLine(val, WarningColor);
49-
}
47+
public IConsoleWrite InfoText(object val) => TextWithColor(val, InfoColor);
48+
public IConsoleWrite ErrorText(object val) => TextWithColor(val, ErrorColor);
49+
public IConsoleWrite WarningText(object val) => TextWithColor(val, WarningColor);
50+
public IConsoleWrite Text(object val) => TextWithColor(val, LineColor);
5051

51-
public IConsoleWrite Line(object val)
52+
public IConsoleWrite TextWithColor(object val, ConsoleColor consoleColor, bool writeLine = false)
5253
{
53-
return ColoredLine(val, LineColor);
54-
}
54+
var text = BeginWriting(val, consoleColor);
5555

56-
public IConsoleWrite ColoredLine(object val, ConsoleColor consoleColor)
57-
{
58-
WriteColoredLineOrText(val, consoleColor, true);
56+
if (writeLine)
57+
Console.WriteLine(val);
58+
else
59+
Console.Write(val);
60+
61+
EndWriting(text, writeLine);
5962
return this;
6063
}
6164

62-
public IConsoleWrite InfoText(object val)
63-
{
64-
return ColoredText(val, InfoColor);
65-
}
65+
#endregion
6666

67-
public IConsoleWrite ErrorText(object val)
68-
{
69-
return ColoredText(val, ErrorColor);
70-
}
67+
#region Async Methods
7168

72-
public IConsoleWrite WarningText(object val)
69+
public async Task NewlineAsync(int count = 1)
7370
{
74-
return ColoredText(val, WarningColor);
71+
for (var i = 0; i < count; i++)
72+
await Console.Out.WriteLineAsync();
7573
}
7674

77-
public IConsoleWrite Text(object val)
75+
public async Task InfoAsync(object val) => await LineWithColorAsync(val, InfoColor);
76+
public async Task ErrorAsync(object val) => await LineWithColorAsync(val, ErrorColor);
77+
public async Task WarningAsync(object val) => await LineWithColorAsync(val, WarningColor);
78+
public async Task LineAsync(object val) => await LineWithColorAsync(val, LineColor);
79+
80+
public async Task LineWithColorAsync(object val, ConsoleColor consoleColor) =>
81+
await TextWithColorAsync(val, consoleColor, true);
82+
83+
public async Task InfoTextAsync(object val) => await TextWithColorAsync(val, InfoColor);
84+
public async Task ErrorTextAsync(object val) => await TextWithColorAsync(val, ErrorColor);
85+
public async Task WarningTextAsync(object val) => await TextWithColorAsync(val, WarningColor);
86+
public async Task TextAsync(object val) => await TextWithColorAsync(val, LineColor);
87+
88+
public async Task TextWithColorAsync(object val, ConsoleColor consoleColor, bool writeLine = false)
7889
{
79-
return ColoredText(val, LineColor);
90+
var text = BeginWriting(val, consoleColor);
91+
92+
if (writeLine)
93+
await Console.Out.WriteLineAsync(text);
94+
else
95+
await Console.Out.WriteAsync(text);
96+
97+
EndWriting(text, writeLine);
8098
}
8199

82-
public IConsoleWrite ColoredText(object val, ConsoleColor consoleColor)
100+
#endregion
101+
102+
protected string BeginWriting(object val, ConsoleColor consoleColor)
83103
{
84-
WriteColoredLineOrText(val, consoleColor, false);
85-
return this;
104+
ConsoleOutputLock.WaitOne();
105+
Console.ForegroundColor = consoleColor;
106+
return val?.ToString() ?? string.Empty;
86107
}
87108

88-
void WriteColoredLineOrText(object val, ConsoleColor consoleColor, bool writeLine)
109+
protected void EndWriting(string text, bool writeLine)
89110
{
90-
if (val == null)
91-
val = String.Empty;
92-
consoleOutputLock.WaitOne();
93-
Console.ForegroundColor = consoleColor;
94-
if (writeLine)
95-
Console.WriteLine(val);
96-
else
97-
Console.Write(val);
98111
Console.ResetColor();
99112
if (IsBufferEnabled)
100113
{
101-
Buffer.Add(val.ToString());
114+
Buffer.Add(text);
102115
if (writeLine)
103116
Buffer.Add(Environment.NewLine);
104117
}
105118

106-
consoleOutputLock.ReleaseMutex();
119+
ConsoleOutputLock.ReleaseMutex();
107120
}
108121

109122
public string FlushBuffer()
@@ -115,12 +128,12 @@ public string FlushBuffer()
115128

116129
public void ToFile(string path, string text, bool shouldAppend = false)
117130
{
118-
fileOutputLock.WaitOne();
131+
FileOutputLock.WaitOne();
119132
if (shouldAppend)
120133
File.AppendAllText(path, text);
121134
else
122135
File.WriteAllText(path, text);
123136

124-
fileOutputLock.ReleaseMutex();
137+
FileOutputLock.ReleaseMutex();
125138
}
126139
}

0 commit comments

Comments
 (0)