Skip to content

Commit

Permalink
added parser and removed useless factory (#22)
Browse files Browse the repository at this point in the history
  • Loading branch information
joshika39 committed Nov 4, 2023
1 parent c900bdc commit 503d983
Show file tree
Hide file tree
Showing 9 changed files with 309 additions and 199 deletions.
40 changes: 40 additions & 0 deletions _src/Implementation/IO/DefaultDataParser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Infrastructure.IO;

namespace Implementation.IO
{
internal class DefaultDataParser : IDataParser
{
public T TryParse<T>(string input, IDataParser.TryParseHandler<T> handler, out bool isOkay)
{
isOkay = handler(input, out var result);
return result;
}

public IEnumerable<T> TryParse<T>(string input, IDataParser.TryParseHandler<T> handler, out bool isOkay, char separator, params char[] separators)
{
isOkay = false;
separators = new[]
{
separator
}.Concat(separators).ToArray();

var lines = input.Split(separators, StringSplitOptions.RemoveEmptyEntries).ToList();
lines.RemoveAll(c => c is "\r\n" or "\n" or "\r" or "\n\r");

var convertedLines = new List<T>();
foreach (var line in lines)
{
isOkay = handler(line, out var result);
if (isOkay)
{
convertedLines.Add(result);
}
}

return convertedLines;
}
}
}
19 changes: 0 additions & 19 deletions _src/Implementation/IO/Factories/IOFactory.cs

This file was deleted.

87 changes: 36 additions & 51 deletions _src/Implementation/IO/Reader.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Infrastructure;
using Infrastructure.IO;
Expand All @@ -13,70 +12,58 @@ internal class Reader : IReader
{
private readonly ILogger _logger;
private readonly IWriter _writer;
private readonly IDataParser _dataParser;

public Reader(ILogger logger, IWriter writer)
public Reader(ILogger logger, IWriter writer, IDataParser dataParser)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_writer = writer ?? throw new ArgumentNullException(nameof(writer));
_dataParser = dataParser ?? throw new ArgumentNullException(nameof(dataParser));
}

public IEnumerable<T> ReadLine<T>(StreamReader streamReader, IReader.TryParseHandler<T> handler,
out bool isOkay, params char[] separators)
public IEnumerable<T> ReadLine<T>(StreamReader streamReader, IDataParser.TryParseHandler<T> handler,
out bool isOkay, char separator, params char[] separators)
{
Console.SetIn(streamReader);
isOkay = false;

var rawInput = ReadLine(streamReader, out var isConsole);
if (isConsole)
{
_logger.LogWrite($"{rawInput}\n");
}
var lines = rawInput.Split(separators, StringSplitOptions.RemoveEmptyEntries).ToList();
lines.RemoveAll(c => c is "\r\n" or "\n" or "\r" or "\n\r");

var convertedLines = new List<T>();
foreach (var line in lines)
{
isOkay = handler(line, out var result);
if (isOkay)
{
convertedLines.Add(result);
}
}

return convertedLines;

return _dataParser.TryParse(rawInput, handler, out isOkay, separator, separators);
}

public T ReadLine<T>(StreamReader streamReader, IReader.TryParseHandler<T> handler, out bool isOkay)
public T? ReadLine<T>(StreamReader streamReader, IDataParser.TryParseHandler<T> handler, out bool isOkay)
{
Console.SetIn(streamReader);
isOkay = false;

var rawInput = ReadLine(streamReader, out var isConsole);
if (isConsole)
{
_logger.LogWrite($"{rawInput}\n");
}
isOkay = handler(rawInput, out var result);

return isOkay ? result : default;

return _dataParser.TryParse(rawInput, handler, out isOkay);
}

public T ReadLine<T>(IReader.TryParseHandler<T> handler, string prompt)
public T? ReadLine<T>(IDataParser.TryParseHandler<T> handler, string prompt, out bool isOkay)
{
var reader = new StreamReader(Console.OpenStandardInput());
var time = DateTime.Now.ToString("HH:mm:ss");
_writer.Write(Constants.EscapeColors.CYAN, $"[ INPUT: {time}] {prompt}");
var ans = ReadLine(reader, handler, out _);
var ans = ReadLine(reader, handler, out isOkay);
return ans;
}

public IEnumerable<T> ReadLine<T>(IReader.TryParseHandler<T> handler, string prompt, params char[] separators)
public IEnumerable<T> ReadLine<T>(IDataParser.TryParseHandler<T> handler, string prompt, char separator, params char[] separators)
{
var reader = new StreamReader(Console.OpenStandardInput());
var time = DateTime.Now.ToString("HH:mm:ss");
_writer.Write(Constants.EscapeColors.CYAN, $"[ INPUT: {time}] {prompt}");
var ans = ReadLine(reader, handler, out _, separators);
var ans = ReadLine(reader, handler, out _, separator, separators);
return ans;
}

Expand All @@ -85,7 +72,7 @@ public string ReadLine(string prompt, string errorMsg)
return ReadLine<string>(Dummy, prompt, errorMsg);
}

public T ReadLine<T>(IReader.TryParseHandler<T> handler, string prompt, string errorMsg)
public T ReadLine<T>(IDataParser.TryParseHandler<T> handler, string prompt, string errorMsg)
{
var reader = new StreamReader(Console.OpenStandardInput());
while (true)
Expand All @@ -94,7 +81,7 @@ public T ReadLine<T>(IReader.TryParseHandler<T> handler, string prompt, string e
_writer.Write(Constants.EscapeColors.CYAN, $"[ INPUT: {time}] {prompt}");
var ans = ReadLine(reader, handler, out var isCorrect);

if (isCorrect)
if (isCorrect && ans is not null)
{
return ans;
}
Expand All @@ -103,15 +90,15 @@ public T ReadLine<T>(IReader.TryParseHandler<T> handler, string prompt, string e
}
}

public IEnumerable<T> ReadLine<T>(IReader.TryParseHandler<T> handler, string prompt, string errorMsg,
params char[] separators)
public IEnumerable<T> ReadLine<T>(IDataParser.TryParseHandler<T> handler, string prompt, string errorMsg,
char separator, params char[] separators)
{
var reader = new StreamReader(Console.OpenStandardInput());
while (true)
{
var time = DateTime.Now.ToString("HH:mm:ss");
_writer.Write(Constants.EscapeColors.CYAN, $"[ INPUT: {time}] {prompt}");
var ans = ReadLine(reader, handler, out var isCorrect, separators);
var ans = ReadLine(reader, handler, out var isCorrect, separator, separators);

if (isCorrect)
{
Expand All @@ -122,27 +109,22 @@ public T ReadLine<T>(IReader.TryParseHandler<T> handler, string prompt, string e
}
}

public T ReadLine<T>(IReader.TryParseHandler<T> handler)
public T? ReadLine<T>(IDataParser.TryParseHandler<T> handler, out bool isOkay)
{
var reader = new StreamReader(Console.OpenStandardInput());
return ReadLine(reader, handler);
return ReadLine(reader, handler, out isOkay);
}

public IEnumerable<T> ReadLine<T>(IReader.TryParseHandler<T> handler, params char[] separators)
public IEnumerable<T> ReadLine<T>(IDataParser.TryParseHandler<T> handler, char separator, params char[] separators)
{
var reader = new StreamReader(Console.OpenStandardInput());
return ReadLine(reader, handler, separators);
}

public T ReadLine<T>(StreamReader streamReader, IReader.TryParseHandler<T> handler)
{
return ReadLine(streamReader, handler, out _);
return ReadLine(reader, handler, separator, separators);
}

public IEnumerable<T> ReadLine<T>(StreamReader streamReader, IReader.TryParseHandler<T> handler,
params char[] separators)
public IEnumerable<T> ReadLine<T>(StreamReader streamReader, IDataParser.TryParseHandler<T> handler,
char separator, params char[] separators)
{
return ReadLine(streamReader, handler, out _, separators);
return ReadLine(streamReader, handler, out _, separator, separators);
}

public string ReadAllLines(string prompt)
Expand All @@ -155,32 +137,35 @@ public string ReadAllLines(string prompt)
return ReadLine(streamReader, out _, true);
}

public IEnumerable<T> ReadAllLines<T>(StreamReader streamReader, IReader.TryParseHandler<T> handler)
public IEnumerable<T> ReadAllLines<T>(StreamReader streamReader, IDataParser.TryParseHandler<T> handler)
{
var items = new List<T>();
while (!streamReader.EndOfStream)
{
items.Add(ReadLine(streamReader, handler));
var item = ReadLine(streamReader, handler, out var isOkay);
if (isOkay && item is not null)
{
items.Add(item);
}
}

return items;
}

public IEnumerable<IEnumerable<T>> ReadAllLines<T>(StreamReader streamReader,
IReader.TryParseHandler<T> handler, params char[] separators)
public IEnumerable<IEnumerable<T>> ReadAllLines<T>(StreamReader streamReader, IDataParser.TryParseHandler<T> handler, char separator, params char[] separators)
{
var items = new List<IEnumerable<T>>();
while (!streamReader.EndOfStream)
{
items.Add(ReadLine(streamReader, handler, separators));
items.Add(ReadLine(streamReader, handler, separator, separators));
}

return items;
}

public static string ReadLine(StreamReader streamReader, out bool fromConsole, bool useEndOfFile=false)
{
fromConsole = !(streamReader.BaseStream.GetType() == typeof(FileStream));
fromConsole = streamReader.BaseStream.GetType() != typeof(FileStream);
Console.SetIn(streamReader);
var sb = new StringBuilder();
while (!streamReader.EndOfStream)
Expand Down
4 changes: 1 addition & 3 deletions _src/Implementation/Module/CoreModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@
using Implementation.Application;
using Implementation.Configuration.Factories;
using Implementation.IO;
using Implementation.IO.Factories;
using Implementation.Navigator.Factories;
using Implementation.Repositories.Factories;
using Infrastructure.Application;
using Infrastructure.Configuration.Factories;
using Infrastructure.IO;
using Infrastructure.IO.Factories;
using Infrastructure.Logger;
using Infrastructure.Module;
using Infrastructure.Navigator.Factories;
Expand All @@ -25,12 +23,12 @@ public void LoadModules(IServiceCollection collection, string projectNamespace)
var mainFolder = Path.Join("joshika39", projectNamespace);
var userFolder = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), mainFolder);
collection.AddScoped<ILogger, Logger.Logger>(_ => new Logger.Logger(Guid.NewGuid()));
collection.AddTransient<IIOFactory, IOFactory>();
collection.AddTransient<INavigatorFactory, NavigatorFactory>();
collection.AddTransient<INavigatorElementFactory, NavigatorElementFactory>();
collection.AddTransient<IConfigurationQueryFactory, JsonConfigurationQueryFactory>();
collection.AddScoped<IWriter, Writer>();
collection.AddScoped<IReader, Reader>();
collection.AddScoped<IDataParser, DefaultDataParser>();
collection.AddTransient<IRepositoryFactory, RepositoryFactory>();
collection.AddTransient<IApplicationSettings, GeneralApplicationSettings>(provider =>
new GeneralApplicationSettings(userFolder, provider.GetRequiredService<IConfigurationQueryFactory>())
Expand Down
11 changes: 0 additions & 11 deletions _src/Infrastructure/IO/Factories/IIOFactory.cs

This file was deleted.

17 changes: 17 additions & 0 deletions _src/Infrastructure/IO/IDataParser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Collections.Generic;

namespace Infrastructure.IO
{
public interface IDataParser
{
/// <summary>
/// Used to specify the parser method for the <c>ReadLine()</c> method.
/// </summary>
/// <typeparam name="T">Can be any ValueType.</typeparam>
delegate bool TryParseHandler<T>(string value, out T result);

T? TryParse<T>(string input, TryParseHandler<T> handler, out bool isOkay);

IEnumerable<T> TryParse<T>(string input, TryParseHandler<T> handler, out bool isOkay, char separator, params char[] separators);
}
}
32 changes: 12 additions & 20 deletions _src/Infrastructure/IO/IReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,13 @@ namespace Infrastructure.IO
{
public interface IReader
{
/// <summary>
/// Used to specify the parser method for the <c>ReadLine()</c> method.
/// </summary>
/// <typeparam name="T">Can be any ValueType.</typeparam>
delegate bool TryParseHandler<T>(string value, out T result);

/// <summary>
/// This is the core method. It is using <c>Console.ReadLine</c> method, to get the data
/// </summary>
/// <param name="streamReader"></param>
/// <param name="handler">A type parser method</param>
/// <param name="isOkay"></param>
/// <param name="separator"></param>
/// <param name="separators"></param>
/// <example>
/// This shows a conversion to <c>int</c>.
Expand All @@ -28,29 +23,26 @@ public interface IReader
/// <seealso cref="Console.ReadLine()"/>
/// <returns>The converted Type passed with the type parameter.</returns>
/// <exception cref="InvalidOperationException">Exception being thrown when the conversion is unsuccessful.</exception>
IEnumerable<T> ReadLine<T>(StreamReader streamReader, TryParseHandler<T> handler, out bool isOkay, params char[] separators);

T ReadLine<T>(StreamReader streamReader, TryParseHandler<T> handler, out bool isOkay);

IEnumerable<T> ReadLine<T>(StreamReader streamReader, IDataParser.TryParseHandler<T> handler, out bool isOkay, char separator, params char[] separators);
T? ReadLine<T>(StreamReader streamReader, IDataParser.TryParseHandler<T> handler, out bool isOkay);

#region ReadLine
T ReadLine<T>(TryParseHandler<T> handler, string prompt);
IEnumerable<T> ReadLine<T>(TryParseHandler<T> handler, string prompt, params char[] separators);
T? ReadLine<T>(IDataParser.TryParseHandler<T> handler, string prompt, out bool isOkay);
IEnumerable<T> ReadLine<T>(IDataParser.TryParseHandler<T> handler, string prompt, char separator, params char[] separators);

string ReadLine(string prompt, string errorMsg);
T ReadLine<T>(TryParseHandler<T> handler, string prompt, string errorMsg);
IEnumerable<T> ReadLine<T>(TryParseHandler<T> handler, string prompt, string errorMsg, params char[] separators);
T ReadLine<T>(IDataParser.TryParseHandler<T> handler, string prompt, string errorMsg);
IEnumerable<T> ReadLine<T>(IDataParser.TryParseHandler<T> handler, string prompt, string errorMsg, char separator, params char[] separators);

T ReadLine<T>(TryParseHandler<T> handler);
IEnumerable<T> ReadLine<T>(TryParseHandler<T> handler, params char[] separators);
T ReadLine<T>(StreamReader streamReader, TryParseHandler<T> handler);
IEnumerable<T> ReadLine<T>(StreamReader streamReader, TryParseHandler<T> handler, params char[] separators);
T? ReadLine<T>(IDataParser.TryParseHandler<T> handler, out bool isOkay);
IEnumerable<T> ReadLine<T>(IDataParser.TryParseHandler<T> handler, char separator, params char[] separators);
IEnumerable<T> ReadLine<T>(StreamReader streamReader, IDataParser.TryParseHandler<T> handler, char separator, params char[] separators);
#endregion

#region ReadAllLines
string ReadAllLines(string prompt);
IEnumerable<T> ReadAllLines<T>(StreamReader streamReader, TryParseHandler<T> handler);
IEnumerable<IEnumerable<T>> ReadAllLines<T>(StreamReader streamReader, TryParseHandler<T> handler, params char[] separators);
IEnumerable<T> ReadAllLines<T>(StreamReader streamReader, IDataParser.TryParseHandler<T> handler);
IEnumerable<IEnumerable<T>> ReadAllLines<T>(StreamReader streamReader, IDataParser.TryParseHandler<T> handler, char separator, params char[] separators);
#endregion


Expand Down

0 comments on commit 503d983

Please sign in to comment.