mirror of
https://github.com/collinbarrett/FilterLists.git
synced 2026-03-11 09:04:27 +00:00
feat(archival): ✨ use PlainText strategy for sources with no extension
This commit is contained in:
parent
574ed2b1fa
commit
dc3f50a3cc
5 changed files with 27 additions and 26 deletions
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
namespace FilterLists.Archival.Infrastructure.Persistence.FileWriteStrategies
|
||||
{
|
||||
internal interface IStreamToTxtConversionStrategy
|
||||
internal interface IStreamToPlainTextConversionStrategy
|
||||
{
|
||||
Stream Convert(IFileSegment fileSegment, CancellationToken cancellationToken);
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
namespace FilterLists.Archival.Infrastructure.Persistence.FileWriteStrategies
|
||||
{
|
||||
public class Txt : IStreamToTxtConversionStrategy
|
||||
public class PlainText : IStreamToPlainTextConversionStrategy
|
||||
{
|
||||
public Stream Convert(IFileSegment fileSegment, CancellationToken cancellationToken)
|
||||
{
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace FilterLists.Archival.Infrastructure.Persistence.FileWriteStrategies
|
||||
{
|
||||
internal static class StreamToPlainTextConversionStrategyFactory
|
||||
{
|
||||
private static readonly IDictionary<string, Func<IStreamToPlainTextConversionStrategy>> Strategies =
|
||||
new Dictionary<string, Func<IStreamToPlainTextConversionStrategy>>
|
||||
{
|
||||
{string.Empty, () => new PlainText()},
|
||||
{".txt", () => new PlainText()}
|
||||
};
|
||||
|
||||
public static TStrategy? GetStrategy<TStrategy>(this IFileSegment segment)
|
||||
where TStrategy : class, IStreamToPlainTextConversionStrategy
|
||||
{
|
||||
return Strategies.TryGetValue(segment.SourceExtension, out var strategy)
|
||||
? (TStrategy?)strategy()
|
||||
: default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace FilterLists.Archival.Infrastructure.Persistence.FileWriteStrategies
|
||||
{
|
||||
internal static class StreamToTxtConversionStrategyFactory
|
||||
{
|
||||
public static TStreamToTxtConversionStrategy? GetStrategy<TStreamToTxtConversionStrategy>(
|
||||
this IFileSegment segment) where TStreamToTxtConversionStrategy : class, IStreamToTxtConversionStrategy
|
||||
{
|
||||
var strategyType = Assembly.GetExecutingAssembly()
|
||||
.GetTypes()
|
||||
.FirstOrDefault(t =>
|
||||
typeof(TStreamToTxtConversionStrategy).IsAssignableFrom(t) &&
|
||||
string.Equals(t.Name, segment.SourceExtension.TrimStart('.'), StringComparison.OrdinalIgnoreCase));
|
||||
return strategyType is default(Type)
|
||||
? default
|
||||
: (TStreamToTxtConversionStrategy)Activator.CreateInstance(strategyType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -40,8 +40,8 @@ public async Task AddFileAsync(IFile file, CancellationToken cancellationToken)
|
|||
var textStreams = new List<Stream>();
|
||||
await foreach (var segment in file.Segments.WithCancellation(cancellationToken))
|
||||
{
|
||||
var strategy = segment.GetStrategy<IStreamToTxtConversionStrategy>();
|
||||
if (strategy is default(IStreamToTxtConversionStrategy))
|
||||
var strategy = segment.GetStrategy<IStreamToPlainTextConversionStrategy>();
|
||||
if (strategy is default(IStreamToPlainTextConversionStrategy))
|
||||
{
|
||||
_logger.LogWarning(
|
||||
"No stream to txt conversion strategy found for extension {Extension} for target {Target}. Skipping file",
|
||||
|
|
|
|||
Loading…
Reference in a new issue