From 09b7db8aaf4be04662945dba893fa839a5c4d046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20G=C3=B3reczny?= Date: Thu, 10 Dec 2020 13:15:11 +0100 Subject: [PATCH] Added Either return type --- .../SessionCompanion.ApiReturn/Either.cs | 65 +++++++++++++++++++ .../SessionCompanion.ApiExtensions.csproj | 7 ++ SessionCompanion/SessionCompanion.sln | 11 +++- .../Controllers/CharacterController.cs | 8 +-- .../SessionCompanion/SessionCompanion.csproj | 1 + SessionCompanion/SessionCompanion/Startup.cs | 2 +- 6 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 SessionCompanion/SessionCompanion.ApiReturn/Either.cs create mode 100644 SessionCompanion/SessionCompanion.ApiReturn/SessionCompanion.ApiExtensions.csproj diff --git a/SessionCompanion/SessionCompanion.ApiReturn/Either.cs b/SessionCompanion/SessionCompanion.ApiReturn/Either.cs new file mode 100644 index 0000000..5f279a0 --- /dev/null +++ b/SessionCompanion/SessionCompanion.ApiReturn/Either.cs @@ -0,0 +1,65 @@ +namespace SessionCompanion.ApiReturn +{ + using System; + + public class Either + { + private readonly TL left; + + private readonly TR right; + + private readonly bool isLeft; + + public Either(TL left) + { + this.left = left; + this.isLeft = true; + } + + public Either(TR right) + { + this.right = right; + this.isLeft = false; + } + + public T Match(Func leftFunc, Func rightFunc) + { + if (leftFunc == null) + { + throw new ArgumentNullException(nameof(leftFunc)); + } + + if (rightFunc == null) + { + throw new ArgumentNullException(nameof(rightFunc)); + } + + return this.isLeft ? leftFunc(this.left) : rightFunc(this.right); + } + + /// + /// If right value is assigned, execute an action on it. + /// + /// Akcja do wykonania + public void DoRight(Action rightAction) + { + if (rightAction == null) + { + throw new ArgumentNullException(nameof(rightAction)); + } + + if (!this.isLeft) + { + rightAction(this.right); + } + } + + public TL LeftOrDefault() => this.Match(l => l, r => default(TL)); + + public TR RightOrDefault() => this.Match(l => default(TR), r => r); + + public static implicit operator Either(TL left) => new Either(left); + + public static implicit operator Either(TR right) => new Either(right); + } +} diff --git a/SessionCompanion/SessionCompanion.ApiReturn/SessionCompanion.ApiExtensions.csproj b/SessionCompanion/SessionCompanion.ApiReturn/SessionCompanion.ApiExtensions.csproj new file mode 100644 index 0000000..f208d30 --- /dev/null +++ b/SessionCompanion/SessionCompanion.ApiReturn/SessionCompanion.ApiExtensions.csproj @@ -0,0 +1,7 @@ + + + + net5.0 + + + diff --git a/SessionCompanion/SessionCompanion.sln b/SessionCompanion/SessionCompanion.sln index c634e22..c12041e 100644 --- a/SessionCompanion/SessionCompanion.sln +++ b/SessionCompanion/SessionCompanion.sln @@ -4,12 +4,17 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 16.0.30717.126 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SessionCompanion", "SessionCompanion\SessionCompanion.csproj", "{C646135F-16CE-4B16-B041-252D343D4E01}" + ProjectSection(ProjectDependencies) = postProject + {0CBA48BB-7C1F-42FB-9008-C75A7681ED09} = {0CBA48BB-7C1F-42FB-9008-C75A7681ED09} + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SessionCompanion.Database", "SessionCompanion.Database\SessionCompanion.Database.csproj", "{CA05189B-A4AB-4946-80DC-EFA075A10F09}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SessionCompanion.ViewModels", "SessionCompanion.ViewModels\SessionCompanion.ViewModels.csproj", "{7762AA75-7B60-4F28-B80A-B03E39140F89}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SessionCompanion.Services", "SessionCompanion.Services\SessionCompanion.Services.csproj", "{C0A172ED-0F4C-4E78-8B64-28E2A756F62F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SessionCompanion.Services", "SessionCompanion.Services\SessionCompanion.Services.csproj", "{C0A172ED-0F4C-4E78-8B64-28E2A756F62F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SessionCompanion.ApiExtensions", "SessionCompanion.ApiReturn\SessionCompanion.ApiExtensions.csproj", "{0CBA48BB-7C1F-42FB-9008-C75A7681ED09}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -33,6 +38,10 @@ Global {C0A172ED-0F4C-4E78-8B64-28E2A756F62F}.Debug|Any CPU.Build.0 = Debug|Any CPU {C0A172ED-0F4C-4E78-8B64-28E2A756F62F}.Release|Any CPU.ActiveCfg = Release|Any CPU {C0A172ED-0F4C-4E78-8B64-28E2A756F62F}.Release|Any CPU.Build.0 = Release|Any CPU + {0CBA48BB-7C1F-42FB-9008-C75A7681ED09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0CBA48BB-7C1F-42FB-9008-C75A7681ED09}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CBA48BB-7C1F-42FB-9008-C75A7681ED09}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0CBA48BB-7C1F-42FB-9008-C75A7681ED09}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs b/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs index afb6af1..061f08d 100644 --- a/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs +++ b/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs @@ -1,13 +1,11 @@ using System.Threading.Tasks; - using Microsoft.AspNetCore.Mvc; - using SessionCompanion.Services.Interfaces; +using SessionCompanion.ViewModels.CharacterViewModels; +using SessionCompanion.ApiReturn; namespace SessionCompanion.Controllers { - using SessionCompanion.ViewModels.CharacterViewModels; - [Route("api/character")] [ApiController] public class CharacterController : Controller @@ -25,7 +23,7 @@ namespace SessionCompanion.Controllers /// Identyfikator postaci /// ViewModel Postaci [HttpGet("{id}")] - public async Task Get(int id) + public async Task> Get(int id) { return await _service.Get(id); } diff --git a/SessionCompanion/SessionCompanion/SessionCompanion.csproj b/SessionCompanion/SessionCompanion/SessionCompanion.csproj index 576f08d..d020f60 100644 --- a/SessionCompanion/SessionCompanion/SessionCompanion.csproj +++ b/SessionCompanion/SessionCompanion/SessionCompanion.csproj @@ -41,6 +41,7 @@ + diff --git a/SessionCompanion/SessionCompanion/Startup.cs b/SessionCompanion/SessionCompanion/Startup.cs index 7cb2723..c3c0cef 100644 --- a/SessionCompanion/SessionCompanion/Startup.cs +++ b/SessionCompanion/SessionCompanion/Startup.cs @@ -45,7 +45,7 @@ namespace SessionCompanion services.AddSwaggerGen(s => { - s.SwaggerDoc("v1", new OpenApiInfo { Title = "Dostêpne API", Version = "v1" }); + s.SwaggerDoc("v1", new OpenApiInfo { Title = "Dost�pne API", Version = "v1" }); var basePath = AppContext.BaseDirectory; var xmlPath = Path.Combine(basePath, "SessionCompanion.xml"); s.IncludeXmlComments(xmlPath);