Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions ErrorHandling/QuerySyntax/ResultQueryExpressionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,17 @@ public static Result<TOutput> SelectMany<TInput, TOutput>(
this Result<TInput> input,
Func<TInput, Result<TOutput>> continuation)
{
throw new NotImplementedException();
return input.Then(continuation);
}

public static Result<TSelected> SelectMany<TInput, TOutput, TSelected>(
this Result<TInput> input,
Func<TInput, Result<TOutput>> continuation,
Func<TInput, TOutput, TSelected> resultSelector)
{
throw new NotImplementedException();
var tempResult = input.SelectMany(continuation);
return !tempResult.IsSuccess
? Result.Fail<TSelected>(tempResult.Error)
: Result.Of(() => resultSelector(input.Value, tempResult.Value));
}
}
38 changes: 26 additions & 12 deletions ErrorHandling/Result.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
using System;
using System.Linq.Expressions;

namespace ErrorHandling;

public class None
{
private None()
{
}
private None() { }
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

кмк EmptyResult лучше


public static readonly None Value = new None();
}


public struct Result<T>
{
public Result(string error, T value = default(T))
Expand All @@ -22,8 +24,7 @@ public struct Result<T>

public T GetValueOrThrow()
{
if (IsSuccess) return Value;
throw new InvalidOperationException($"No value. Only Error {Error}");
return IsSuccess ? Value : throw new InvalidOperationException($"No value. Only Error {Error}");
}

public bool IsSuccess => Error == null;
Expand Down Expand Up @@ -62,20 +63,33 @@ public static Result<TOutput> Then<TInput, TOutput>(
this Result<TInput> input,
Func<TInput, TOutput> continuation)
{
throw new NotImplementedException();
return !input.IsSuccess ? Fail<TOutput>(input.Error) : Of(() => continuation(input.Value), input.Error);
}

public static Result<TOutput> Then<TInput, TOutput>(
this Result<TInput> input,
Func<TInput, Result<TOutput>> continuation)
{
throw new NotImplementedException();
return !input.IsSuccess ? Fail<TOutput>(input.Error) : Of(() => continuation(input.Value), input.Error).Value;
}

public static Result<TInput> OnFail<TInput>(
this Result<TInput> input,
Action<string> handleError)
public static Result<TInput> ReplaceError<TInput>(this Result<TInput> input, Func<string, string> replacement)
{
return input.IsSuccess ? input : Fail<TInput>(replacement(input.Error));;
}

public static Result<TInput> RefineError<TInput>(this Result<TInput> input, string refineErrorMessage)
{
throw new NotImplementedException();
return ReplaceError(input, err => $"{refineErrorMessage}. {input.Error}");
}
}

public static Result<TInput> OnFail<TInput>(this Result<TInput> input, Action<string> handleError)
{
if (!input.IsSuccess)
{
handleError(input.Error);
}

return input;
}
}
20 changes: 20 additions & 0 deletions TagCloud.Client/ContainerBuilderHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using Autofac;
using ErrorHandling;
using TagCloud.DI;

namespace TagCloud.Client;

public static class ContainerBuilderHelper
{
public static Result<(IContainer container, ProgramArgs args)> BuildContainer(ProgramArgs args)
{
return Result.Of(() =>
{
var builder = new ContainerBuilder();
builder.RegisterModule(new TagCloudModule(args.WordsFile, args.StopWordsFile));

var container = builder.Build();
return (container, args);
}, "Ошибка при создании контейнера");
}
}
30 changes: 30 additions & 0 deletions TagCloud.Client/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using ErrorHandling;
using TagCloud.Client;

public class Program
{
public static int Main(string[] args)
{
return Run(args)
.OnFail(err => Console.WriteLine("Ошибка: " + err))
.IsSuccess
? 0
: -1;
}

private static Result<None> Run(string[] args)
{
return
ProgramArgsValidator.ValidateArgs(args)
.Then(ProgramArgsValidator.ParseArgs)
.Then(ProgramArgsValidator.ValidateFiles)
.Then(ProgramArgsValidator.ValidateFont)
.Then(ContainerBuilderHelper.BuildContainer)
.Then(TagCloudGeneratorHelper.GenerateTagCloud)
.Then(_ =>
{
Console.WriteLine("Генерация завершена");
return None.Value;
});
}
}
9 changes: 9 additions & 0 deletions TagCloud.Client/ProgramArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace TagCloud.Client;

public record ProgramArgs(
string WordsFile,
string StopWordsFile,
string OutputFile,
int Width,
int Height,
string FontName);
85 changes: 85 additions & 0 deletions TagCloud.Client/ProgramArgsValidator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
using System.Drawing;
using System.Drawing.Text;
using Autofac;
using ErrorHandling;
using TagCloud;
using TagCloud.DI;
using TagCloud.Models;

namespace TagCloud.Client;

public static class ProgramArgsValidator
{
public static Result<string[]> ValidateArgs(string[] args)
{
return args.Length < 3
? Result.Fail<string[]>("Не переданы аргументы")
: Result.Ok(args);
}

public static Result<ProgramArgs> ParseArgs(string[] args)
{
return Result.Of(() =>
{
var width = args.Length > 3 ? int.Parse(args[3]) : 1200;
var height = args.Length > 4 ? int.Parse(args[4]) : 800;
var fontName = args.Length > 5 ? args[5] : "Arial";

return new ProgramArgs(
args[0],
args[1],
args[2],
width,
height,
fontName
);
}, "Ошибка при разборе аргументов");
}

public static Result<ProgramArgs> ValidateFiles(ProgramArgs args)
{
if (!File.Exists(args.WordsFile))
return Result.Fail<ProgramArgs>($"Файл слов не найден: {args.WordsFile}");

return !File.Exists(args.StopWordsFile)
? Result.Fail<ProgramArgs>($"Файл стоп-слов не найден: {args.StopWordsFile}")
: Result.Ok(args);
}

public static Result<ProgramArgs> ValidateFont(ProgramArgs args)
{
var fonts = new InstalledFontCollection();

var exists = fonts.Families
.Any(f => string.Equals(f.Name, args.FontName, StringComparison.OrdinalIgnoreCase));

return !exists ? Result.Fail<ProgramArgs>($"Шрифт не найден в системе: {args.FontName}") : Result.Ok(args);
}

public static Result<None> GenerateTagCloud((IContainer container, ProgramArgs args) input)
{
return Result.Of(() =>
{
var (container, args) = input;

var config = new TagCloudVisualizationConfig
{
CanvasWidth = args.Width,
CanvasHeight = args.Height,
CanvasBackgroundColor = Color.Black,
ShapeFillColor = Color.DarkSlateGray,
ShapeBorderColor = Color.White,
ShapeBorderThickness = 1,
FontName = args.FontName
};

using var scope = container.BeginLifetimeScope();
var generator = scope.Resolve<TagCloudGenerator>();

generator.Generate(args.OutputFile, config);

Console.WriteLine($"Файл сохранён: {args.OutputFile}");
return None.Value;
}, "Ошибка при генерации облака тегов");
}
}
19 changes: 19 additions & 0 deletions TagCloud.Client/TagCloud.Client.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Autofac" Version="9.0.0"/>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\ErrorHandling\ErrorHandling.csproj" />
<ProjectReference Include="..\TagCloud.Core\TagCloud.Core.csproj"/>
</ItemGroup>

</Project>
37 changes: 37 additions & 0 deletions TagCloud.Client/TagCloudGeneratorHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System.Drawing;
using Autofac;
using ErrorHandling;
using TagCloud.Models;


namespace TagCloud.Client;

public static class TagCloudGeneratorHelper
{
public static Result<None> GenerateTagCloud((IContainer container, ProgramArgs args) input)
{
return Result.Of(() =>
{
var (container, args) = input;

var config = new TagCloudVisualizationConfig
{
CanvasWidth = args.Width,
CanvasHeight = args.Height,
CanvasBackgroundColor = Color.Black,
ShapeFillColor = Color.DarkSlateGray,
ShapeBorderColor = Color.White,
ShapeBorderThickness = 1,
FontName = args.FontName
};

using var scope = container.BeginLifetimeScope();
var generator = scope.Resolve<TagCloudGenerator>();

generator.Generate(args.OutputFile, config);

Console.WriteLine($"Файл сохранён: {args.OutputFile}");
return None.Value;
}, "Ошибка при генерации облака тегов");
}
}
Binary file added TagCloud.Client/output2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added TagCloud.Client/stopwords.docx
Binary file not shown.
11 changes: 11 additions & 0 deletions TagCloud.Client/stopwords.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
hello
the
and
a
of
in
on
at
for
rain
sun
Binary file added TagCloud.Client/words.docx
Binary file not shown.
Loading