Skip to content

Commit b426995

Browse files
authored
Merge pull request #17 from alasconnect/fsharp-model-validation-giraffe
Add Giraffe model validation library and examples
2 parents 445b910 + 9870ae4 commit b426995

File tree

8 files changed

+298
-60
lines changed

8 files changed

+298
-60
lines changed

FSharp.Data.Validation.sln

Lines changed: 67 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio Version 17
4-
VisualStudioVersion = 17.0.32014.148
4+
VisualStudioVersion = 17.6.33829.357
55
MinimumVisualStudioVersion = 10.0.40219.1
6-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{81E2EE62-75DE-4076-A922-0D8F5CFBC58A}"
7-
ProjectSection(SolutionItems) = preProject
8-
paket.dependencies = paket.dependencies
9-
EndProjectSection
6+
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Data.Validation", "src\FSharp.Data.Validation\FSharp.Data.Validation.fsproj", "{7676B856-8E80-4330-BD0F-4F4A18EE72E4}"
107
EndProject
11-
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Data.Validation", "src\FSharp.Data.Validation\FSharp.Data.Validation.fsproj", "{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}"
8+
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Data.Validation.Samples", "samples\FSharp.Data.Validation.Samples\FSharp.Data.Validation.Samples.fsproj", "{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}"
129
EndProject
13-
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Data.Validation.Tests", "tests\FSharp.Data.Validation.Tests\FSharp.Data.Validation.Tests.fsproj", "{514C35F5-E85D-4D05-99B8-BCC66453BA28}"
10+
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "GettingStarted", "samples\GettingStarted\GettingStarted.fsproj", "{C3A30080-0116-460A-B829-7898C0EC980C}"
1411
EndProject
15-
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Data.Validation.Samples", "samples\FSharp.Data.Validation.Samples\FSharp.Data.Validation.Samples.fsproj", "{AE3EAA51-E31F-4375-BB07-06A729BC08C6}"
12+
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Data.Validation.Tests", "tests\FSharp.Data.Validation.Tests\FSharp.Data.Validation.Tests.fsproj", "{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}"
1613
EndProject
17-
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "GettingStarted", "samples\GettingStarted\GettingStarted.fsproj", "{546895DC-8873-4A64-A4E0-EE889BE75A80}"
14+
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Data.Validation.Giraffe", "src\FSharp.Data.Validation.Giraffe\FSharp.Data.Validation.Giraffe.fsproj", "{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}"
1815
EndProject
1916
Global
2017
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -26,59 +23,71 @@ Global
2623
Release|x86 = Release|x86
2724
EndGlobalSection
2825
GlobalSection(ProjectConfigurationPlatforms) = postSolution
29-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
30-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
31-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Debug|x64.ActiveCfg = Debug|Any CPU
32-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Debug|x64.Build.0 = Debug|Any CPU
33-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Debug|x86.ActiveCfg = Debug|Any CPU
34-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Debug|x86.Build.0 = Debug|Any CPU
35-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
36-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Release|Any CPU.Build.0 = Release|Any CPU
37-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Release|x64.ActiveCfg = Release|Any CPU
38-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Release|x64.Build.0 = Release|Any CPU
39-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Release|x86.ActiveCfg = Release|Any CPU
40-
{F15EC412-13D6-4B4C-ACB1-D2DFBC6D3D0B}.Release|x86.Build.0 = Release|Any CPU
41-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
42-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Debug|Any CPU.Build.0 = Debug|Any CPU
43-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Debug|x64.ActiveCfg = Debug|Any CPU
44-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Debug|x64.Build.0 = Debug|Any CPU
45-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Debug|x86.ActiveCfg = Debug|Any CPU
46-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Debug|x86.Build.0 = Debug|Any CPU
47-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Release|Any CPU.ActiveCfg = Release|Any CPU
48-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Release|Any CPU.Build.0 = Release|Any CPU
49-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Release|x64.ActiveCfg = Release|Any CPU
50-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Release|x64.Build.0 = Release|Any CPU
51-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Release|x86.ActiveCfg = Release|Any CPU
52-
{514C35F5-E85D-4D05-99B8-BCC66453BA28}.Release|x86.Build.0 = Release|Any CPU
53-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
54-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
55-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Debug|x64.ActiveCfg = Debug|Any CPU
56-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Debug|x64.Build.0 = Debug|Any CPU
57-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Debug|x86.ActiveCfg = Debug|Any CPU
58-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Debug|x86.Build.0 = Debug|Any CPU
59-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
60-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Release|Any CPU.Build.0 = Release|Any CPU
61-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Release|x64.ActiveCfg = Release|Any CPU
62-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Release|x64.Build.0 = Release|Any CPU
63-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Release|x86.ActiveCfg = Release|Any CPU
64-
{AE3EAA51-E31F-4375-BB07-06A729BC08C6}.Release|x86.Build.0 = Release|Any CPU
65-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
66-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Debug|Any CPU.Build.0 = Debug|Any CPU
67-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Debug|x64.ActiveCfg = Debug|Any CPU
68-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Debug|x64.Build.0 = Debug|Any CPU
69-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Debug|x86.ActiveCfg = Debug|Any CPU
70-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Debug|x86.Build.0 = Debug|Any CPU
71-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Release|Any CPU.ActiveCfg = Release|Any CPU
72-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Release|Any CPU.Build.0 = Release|Any CPU
73-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Release|x64.ActiveCfg = Release|Any CPU
74-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Release|x64.Build.0 = Release|Any CPU
75-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Release|x86.ActiveCfg = Release|Any CPU
76-
{546895DC-8873-4A64-A4E0-EE889BE75A80}.Release|x86.Build.0 = Release|Any CPU
26+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
27+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
28+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Debug|x64.ActiveCfg = Debug|Any CPU
29+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Debug|x64.Build.0 = Debug|Any CPU
30+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Debug|x86.ActiveCfg = Debug|Any CPU
31+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Debug|x86.Build.0 = Debug|Any CPU
32+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
33+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Release|Any CPU.Build.0 = Release|Any CPU
34+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Release|x64.ActiveCfg = Release|Any CPU
35+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Release|x64.Build.0 = Release|Any CPU
36+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Release|x86.ActiveCfg = Release|Any CPU
37+
{7676B856-8E80-4330-BD0F-4F4A18EE72E4}.Release|x86.Build.0 = Release|Any CPU
38+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
39+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Debug|Any CPU.Build.0 = Debug|Any CPU
40+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Debug|x64.ActiveCfg = Debug|Any CPU
41+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Debug|x64.Build.0 = Debug|Any CPU
42+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Debug|x86.ActiveCfg = Debug|Any CPU
43+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Debug|x86.Build.0 = Debug|Any CPU
44+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Release|Any CPU.ActiveCfg = Release|Any CPU
45+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Release|Any CPU.Build.0 = Release|Any CPU
46+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Release|x64.ActiveCfg = Release|Any CPU
47+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Release|x64.Build.0 = Release|Any CPU
48+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Release|x86.ActiveCfg = Release|Any CPU
49+
{A5490A1B-B8C5-42CE-ACCE-7B1BFE7E4483}.Release|x86.Build.0 = Release|Any CPU
50+
{C3A30080-0116-460A-B829-7898C0EC980C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
51+
{C3A30080-0116-460A-B829-7898C0EC980C}.Debug|Any CPU.Build.0 = Debug|Any CPU
52+
{C3A30080-0116-460A-B829-7898C0EC980C}.Debug|x64.ActiveCfg = Debug|Any CPU
53+
{C3A30080-0116-460A-B829-7898C0EC980C}.Debug|x64.Build.0 = Debug|Any CPU
54+
{C3A30080-0116-460A-B829-7898C0EC980C}.Debug|x86.ActiveCfg = Debug|Any CPU
55+
{C3A30080-0116-460A-B829-7898C0EC980C}.Debug|x86.Build.0 = Debug|Any CPU
56+
{C3A30080-0116-460A-B829-7898C0EC980C}.Release|Any CPU.ActiveCfg = Release|Any CPU
57+
{C3A30080-0116-460A-B829-7898C0EC980C}.Release|Any CPU.Build.0 = Release|Any CPU
58+
{C3A30080-0116-460A-B829-7898C0EC980C}.Release|x64.ActiveCfg = Release|Any CPU
59+
{C3A30080-0116-460A-B829-7898C0EC980C}.Release|x64.Build.0 = Release|Any CPU
60+
{C3A30080-0116-460A-B829-7898C0EC980C}.Release|x86.ActiveCfg = Release|Any CPU
61+
{C3A30080-0116-460A-B829-7898C0EC980C}.Release|x86.Build.0 = Release|Any CPU
62+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
63+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
64+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Debug|x64.ActiveCfg = Debug|Any CPU
65+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Debug|x64.Build.0 = Debug|Any CPU
66+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Debug|x86.ActiveCfg = Debug|Any CPU
67+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Debug|x86.Build.0 = Debug|Any CPU
68+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
69+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Release|Any CPU.Build.0 = Release|Any CPU
70+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Release|x64.ActiveCfg = Release|Any CPU
71+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Release|x64.Build.0 = Release|Any CPU
72+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Release|x86.ActiveCfg = Release|Any CPU
73+
{D1DF85B0-E745-44E7-9851-0D4E7B3ED0DD}.Release|x86.Build.0 = Release|Any CPU
74+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
75+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
76+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Debug|x64.ActiveCfg = Debug|Any CPU
77+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Debug|x64.Build.0 = Debug|Any CPU
78+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Debug|x86.ActiveCfg = Debug|Any CPU
79+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Debug|x86.Build.0 = Debug|Any CPU
80+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
81+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Release|Any CPU.Build.0 = Release|Any CPU
82+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Release|x64.ActiveCfg = Release|Any CPU
83+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Release|x64.Build.0 = Release|Any CPU
84+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Release|x86.ActiveCfg = Release|Any CPU
85+
{99EA41F7-1E77-4DD2-9D2E-9F7BE20441FB}.Release|x86.Build.0 = Release|Any CPU
7786
EndGlobalSection
7887
GlobalSection(SolutionProperties) = preSolution
7988
HideSolutionNode = FALSE
8089
EndGlobalSection
8190
GlobalSection(ExtensibilityGlobals) = postSolution
82-
SolutionGuid = {89965EBE-B91E-4AA8-92F9-BC4515F08692}
91+
SolutionGuid = {51A59B35-DF1E-4F55-86A9-D3C1C22C698D}
8392
EndGlobalSection
8493
EndGlobal

paket.dependencies

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ nuget FsCheck
66
nuget FsCheck.Xunit
77
nuget FSharp.Core
88
nuget FsUnit.xUnit
9+
nuget Giraffe
910
nuget Microsoft.NET.Test.Sdk
1011
nuget xunit
1112
nuget xunit.runner.visualstudio
12-
nuget coverlet.collector
13+
nuget coverlet.collector

paket.lock

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,16 @@ NUGET
1414
NETStandard.Library (>= 2.0.3)
1515
NHamcrest (>= 2.0.1 < 2.1)
1616
xunit (>= 2.4.1 < 2.5)
17+
Giraffe (6.2)
18+
FSharp.Core (>= 6.0)
19+
Giraffe.ViewEngine (>= 1.4)
20+
Microsoft.IO.RecyclableMemoryStream (>= 2.2.1)
21+
Newtonsoft.Json (>= 13.0.3)
22+
System.Text.Json (>= 7.0.3)
23+
Giraffe.ViewEngine (1.4)
24+
FSharp.Core (>= 5.0)
1725
Microsoft.CodeCoverage (17.0)
26+
Microsoft.IO.RecyclableMemoryStream (2.3.2)
1827
Microsoft.NET.Test.Sdk (17.0)
1928
Microsoft.CodeCoverage (>= 17.0)
2029
Microsoft.TestPlatform.TestHost (>= 17.0)
@@ -27,7 +36,7 @@ NUGET
2736
Newtonsoft.Json (>= 9.0.1)
2837
NETStandard.Library (2.0.3)
2938
Microsoft.NETCore.Platforms (>= 1.1)
30-
Newtonsoft.Json (13.0.1)
39+
Newtonsoft.Json (13.0.3)
3140
NHamcrest (2.0.1)
3241
NETStandard.Library (>= 1.6.1)
3342
NuGet.Frameworks (6.0)
@@ -36,6 +45,11 @@ NUGET
3645
System.Reflection.Metadata (6.0)
3746
System.Collections.Immutable (>= 6.0)
3847
System.Runtime.CompilerServices.Unsafe (6.0)
48+
System.Text.Encodings.Web (7.0)
49+
System.Runtime.CompilerServices.Unsafe (>= 6.0)
50+
System.Text.Json (7.0.3)
51+
System.Runtime.CompilerServices.Unsafe (>= 6.0)
52+
System.Text.Encodings.Web (>= 7.0)
3953
xunit (2.4.1)
4054
xunit.analyzers (>= 0.10)
4155
xunit.assert (2.4.1)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Revision history for fsharp-data-validation
2+
3+
## 0.0.1 - 07/21/2023
4+
5+
* First version of library to provide useful alternative to Giraffe interface for integrating with FSharp.Data.Validation library.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project Sdk="Microsoft.NET.Sdk">
3+
<PropertyGroup>
4+
<TargetFramework>net6.0</TargetFramework>
5+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
6+
<Description>Model validation helpers for Giraffe.</Description>
7+
<Company>Matanuska Telecom Association</Company>
8+
<Authors>Matanuska Telecom Association</Authors>
9+
<PackageReadmeFile>README.md</PackageReadmeFile>
10+
<RepositoryUrl>https://github.com/alasconnect/fsharp-data-validation</RepositoryUrl>
11+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
12+
<Version>0.0.1</Version>
13+
</PropertyGroup>
14+
<ItemGroup>
15+
<Compile Include="Library.fs" />
16+
<None Include=".\README.md">
17+
<Pack>True</Pack>
18+
<PackagePath>\</PackagePath>
19+
</None>
20+
<None Include=".\CHANGELOG.md">
21+
<Pack>false</Pack>
22+
<PackagePath>\</PackagePath>
23+
</None>
24+
<None Include="paket.references" />
25+
</ItemGroup>
26+
<Import Project="..\..\.paket\Paket.Restore.targets" />
27+
</Project>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
namespace FSharp.Data.Validation.Giraffe
2+
3+
open Giraffe
4+
5+
[<AutoOpen>]
6+
module ModelValidation =
7+
8+
/// <summary>
9+
/// Interface defining model validation methods.
10+
///
11+
/// This interface is a re-implementation of the Giraffe interface of the same
12+
/// name, but with the addition of a generic type parameter 'U which is the
13+
/// type of the object returned by the Validate method.
14+
/// </summary>
15+
type IModelValidation<'T, 'U> =
16+
/// <summary>
17+
/// Contract for validating an object's state.
18+
///
19+
/// If the object has a valid state then the function should return the object, otherwise it should return a `HttpHandler` function which is ought to return an error response back to a client.
20+
/// </summary>
21+
abstract member Validate : unit -> Result<'U, HttpHandler>
22+
23+
/// <summary>
24+
/// Validates an object of type 'T where 'T must have implemented interface <see cref="IModelValidation{T, U}"/>.
25+
///
26+
/// If validation was successful then object 'T will be passed into the <see cref="HttpHandler"/> function "f", otherwise an error response will be sent back to the client.
27+
/// </summary>
28+
/// <param name="f">A function which accepts the model 'T and returns a <see cref="HttpHandler"/> function.</param>
29+
/// <param name="model">An instance of type 'T, where 'T must implement interface <see cref="IModelValidation{T, U}"/>.</param>
30+
/// <typeparam name="'T"></typeparam>
31+
/// <typeparam name="'U"></typeparam>
32+
/// <returns>A Giraffe <see cref="HttpHandler"/> function which can be composed into a bigger web application.</returns>
33+
let validateModel<'T, 'U when 'T :> IModelValidation<'T, 'U>> (f : 'U -> HttpHandler) (model : 'T) : HttpHandler =
34+
match model.Validate() with
35+
| Ok validatedModel -> f validatedModel
36+
| Error err -> err

0 commit comments

Comments
 (0)