diff --git a/CLAUDE.md b/CLAUDE.md index c0719c1..96a5f84 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -97,7 +97,7 @@ nested `IUnionMembers` explicitly so it stays out of the public API), `Valid.cs` ## Workflow - Squash-merged PRs; the PR title is a Conventional Commit and the description says `Closes #n`. Versions come from git - tags via MinVer. Only three releases are planned (`1.0.0-alpha.1`, `1.0.0-beta.1`, `1.0.0`); release PRs are merged - by the maintainer. To force a release without `feat:`/`fix:`/`perf:`, merge with a `Release-As:` footer + tags via MinVer (1.0 came as `1.0.0-alpha.1`, `1.0.0-beta.1`, `1.0.0`; since then plain semver). Release PRs are + merged by the maintainer, and the public API in `PublicAPI.Shipped.txt` changes only with a major version. To force a release without `feat:`/`fix:`/`perf:`, merge with a `Release-As:` footer (`gh pr merge --squash --body "Release-As: x.y.z"`). - Cards are built test-first: failing tests plus `NotImplementedException` stubs, then implement until green. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dfb8e3b..a0f9b6c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,9 +32,9 @@ compiler and check the diagnostics. They pin down how C# unions behave with `Val Releases are automated with release-please and published to nuget.org with Trusted Publishing. 1. Every push to `main` updates an open *release PR* with the next version and the changelog. Work is planned in - GitHub milestones and issues; the release PR stays open across several milestones and is merged only at the three - release points of 1.0 (`1.0.0-alpha.1`, `1.0.0-beta.1`, `1.0.0`). -2. Merging the release PR tags the commit (`v1.0.0-alpha.1`, ...) and creates a GitHub release. + GitHub milestones and issues; the release PR stays open across several milestones and is merged at the release + points (1.0 itself came as `1.0.0-alpha.1`, `1.0.0-beta.1` and `1.0.0`). +2. Merging the release PR tags the commit (`v1.0.0`, ...) and creates a GitHub release. 3. The `publish` job (environment `release`, needs approval) packs the tagged commit and pushes it to nuget.org. The package version comes from the git tag through MinVer; nothing else needs editing. @@ -52,11 +52,11 @@ release with a `Release-As:` footer in the commit body. Pull requests are squash message, so the GitHub UI drops footers; merge from the command line instead: ```bash -gh pr merge --squash --subject "chore: start beta releases (#)" --body "Release-As: 1.0.0-beta.1" +gh pr merge --squash --subject "chore: release 1.1.0 (#)" --body "Release-As: 1.1.0" ``` -Until 1.0.0 the configuration produces pre-releases (`prerelease-type` alpha, then beta); 1.0.0 drops those settings, -and later versions follow plain semantic versioning (`fix:` → 1.0.1, `feat:` → 1.1.0, a breaking change → 2.0.0). +Since 1.0.0 the configuration has no pre-release settings: versions follow plain semantic versioning (`fix:` → 1.0.1, +`feat:` → 1.1.0, a breaking change → 2.0.0). ## Public API diff --git a/README.md b/README.md index df75ce7..59c562d 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ Applicative validation for C# 15 built on union types: a `Validated` is either a valid value or one or more errors, and independent validations combine by accumulating every error instead of stopping at the first one. -> **Status:** 1.0 is a ground-up rewrite for .NET 11 and C# 15 unions, now in beta: the API is complete. The 0.5 -> line is retired; see [Migrating from 0.5](#migrating-from-05). +> **Status:** 1.0 is a ground-up rewrite for .NET 11 and C# 15 unions. The 0.5 line is retired; see +> [Migrating from 0.5](#migrating-from-05). ```csharp using DotValid; diff --git a/release-please-config.json b/release-please-config.json index 7041b17..bb012c9 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -3,9 +3,7 @@ "release-type": "simple", "include-v-in-tag": true, "include-component-in-tag": false, - "versioning": "prerelease", - "prerelease": true, - "prerelease-type": "beta", + "prerelease": false, "packages": { ".": { "changelog-path": "CHANGELOG.md" diff --git a/src/DotValid/PublicAPI.Shipped.txt b/src/DotValid/PublicAPI.Shipped.txt index 7dc5c58..0faab25 100644 --- a/src/DotValid/PublicAPI.Shipped.txt +++ b/src/DotValid/PublicAPI.Shipped.txt @@ -1 +1,96 @@ #nullable enable +DotValid.Invalid +DotValid.Invalid.Deconstruct(out System.Collections.Immutable.ImmutableArray errors) -> void +DotValid.Invalid.Equals(DotValid.Invalid other) -> bool +DotValid.Invalid.Errors.get -> System.Collections.Immutable.ImmutableArray +DotValid.Invalid.Invalid() -> void +DotValid.Invalid.Invalid(params System.ReadOnlySpan errors) -> void +DotValid.Invalid.Invalid(TError error) -> void +DotValid.Prelude +DotValid.Valid +DotValid.Valid.Deconstruct(out T value) -> void +DotValid.Valid.Equals(DotValid.Valid other) -> bool +DotValid.Valid.Valid() -> void +DotValid.Valid.Valid(T value) -> void +DotValid.Valid.Value.get -> T +DotValid.Validated +DotValid.Validated +DotValid.Validated.Ensure(System.Func! predicate, System.Func! error) -> DotValid.Validated +DotValid.Validated.Ensure(System.Func! predicate, TError error) -> DotValid.Validated +DotValid.Validated.Equals(DotValid.Validated other) -> bool +DotValid.Validated.IUnionMembers +DotValid.Validated.IUnionMembers.Create(DotValid.Invalid value) -> DotValid.Validated +DotValid.Validated.IUnionMembers.Create(DotValid.Valid value) -> DotValid.Validated +DotValid.Validated.IUnionMembers.TryGetValue(out DotValid.Invalid value) -> bool +DotValid.Validated.IUnionMembers.TryGetValue(out DotValid.Valid value) -> bool +DotValid.Validated.IUnionMembers.Value.get -> object? +DotValid.Validated.Map(System.Func! map) -> DotValid.Validated +DotValid.Validated.MapAsync(System.Func!>! map) -> System.Threading.Tasks.ValueTask> +DotValid.Validated.MapError(System.Func! map) -> DotValid.Validated +DotValid.Validated.Match(System.Func! valid, System.Func, TResult>! invalid) -> TResult +DotValid.Validated.MatchAsync(System.Func!>! valid, System.Func, System.Threading.Tasks.Task!>! invalid) -> System.Threading.Tasks.ValueTask +DotValid.Validated.MatchAsync(System.Func!>! valid, System.Func, TResult>! invalid) -> System.Threading.Tasks.ValueTask +DotValid.Validated.OrDefault(System.Func, T>! fallback) -> T +DotValid.Validated.OrDefault(T fallback) -> T +DotValid.Validated.Select(System.Func! selector) -> DotValid.Validated +DotValid.Validated.Then(System.Func>! next) -> DotValid.Validated +DotValid.Validated.ThenAsync(System.Func>!>! next) -> System.Threading.Tasks.ValueTask> +DotValid.Validated.Validated() -> void +DotValid.Validated.Zip(DotValid.Validated other, System.Func! combine) -> DotValid.Validated +DotValid.Validated.Zip(DotValid.Validated other) -> DotValid.Validated<(T, TOther), TError> +DotValid.ValidationError +DotValid.ValidationError.Deconstruct(out string! Property, out string! Message) -> void +DotValid.ValidationError.Equals(DotValid.ValidationError other) -> bool +DotValid.ValidationError.Message.get -> string! +DotValid.ValidationError.Property.get -> string! +DotValid.ValidationError.ValidationError() -> void +DotValid.ValidationError.ValidationError(string! Property, string! Message) -> void +override DotValid.Invalid.Equals(object? obj) -> bool +override DotValid.Invalid.GetHashCode() -> int +override DotValid.Invalid.ToString() -> string! +override DotValid.Valid.Equals(object? obj) -> bool +override DotValid.Valid.GetHashCode() -> int +override DotValid.Valid.ToString() -> string! +override DotValid.Validated.Equals(object? obj) -> bool +override DotValid.Validated.GetHashCode() -> int +override DotValid.Validated.ToString() -> string! +override DotValid.ValidationError.GetHashCode() -> int +override DotValid.ValidationError.ToString() -> string! +static DotValid.Invalid.operator !=(DotValid.Invalid left, DotValid.Invalid right) -> bool +static DotValid.Invalid.operator ==(DotValid.Invalid left, DotValid.Invalid right) -> bool +static DotValid.Prelude.invalid(params System.ReadOnlySpan errors) -> DotValid.Invalid +static DotValid.Prelude.invalid(TError error) -> DotValid.Invalid +static DotValid.Prelude.valid(T value) -> DotValid.Valid +static DotValid.Valid.operator !=(DotValid.Valid left, DotValid.Valid right) -> bool +static DotValid.Valid.operator ==(DotValid.Valid left, DotValid.Valid right) -> bool +static DotValid.Validated.Apply(this DotValid.Validated!, TError> function, DotValid.Validated argument) -> DotValid.Validated +static DotValid.Validated.Check(T value, System.Func! predicate, System.Func! error) -> DotValid.Validated +static DotValid.Validated.Check(T value, System.Func! predicate, TError error) -> DotValid.Validated +static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, DotValid.Validated fourth, DotValid.Validated fifth, DotValid.Validated sixth, DotValid.Validated seventh, DotValid.Validated eighth, System.Func! combine) -> DotValid.Validated +static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, DotValid.Validated fourth, DotValid.Validated fifth, DotValid.Validated sixth, DotValid.Validated seventh, System.Func! combine) -> DotValid.Validated +static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, DotValid.Validated fourth, DotValid.Validated fifth, DotValid.Validated sixth, System.Func! combine) -> DotValid.Validated +static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, DotValid.Validated fourth, DotValid.Validated fifth, System.Func! combine) -> DotValid.Validated +static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, DotValid.Validated fourth, System.Func! combine) -> DotValid.Validated +static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, System.Func! combine) -> DotValid.Validated +static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, System.Func! combine) -> DotValid.Validated +static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Threading.Tasks.Task>! fourth, System.Threading.Tasks.Task>! fifth, System.Threading.Tasks.Task>! sixth, System.Threading.Tasks.Task>! seventh, System.Threading.Tasks.Task>! eighth, System.Func! combine) -> System.Threading.Tasks.ValueTask> +static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Threading.Tasks.Task>! fourth, System.Threading.Tasks.Task>! fifth, System.Threading.Tasks.Task>! sixth, System.Threading.Tasks.Task>! seventh, System.Func! combine) -> System.Threading.Tasks.ValueTask> +static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Threading.Tasks.Task>! fourth, System.Threading.Tasks.Task>! fifth, System.Threading.Tasks.Task>! sixth, System.Func! combine) -> System.Threading.Tasks.ValueTask> +static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Threading.Tasks.Task>! fourth, System.Threading.Tasks.Task>! fifth, System.Func! combine) -> System.Threading.Tasks.ValueTask> +static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Threading.Tasks.Task>! fourth, System.Func! combine) -> System.Threading.Tasks.ValueTask> +static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Func! combine) -> System.Threading.Tasks.ValueTask> +static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Func! combine) -> System.Threading.Tasks.ValueTask> +static DotValid.Validated.Errors(this System.Collections.Generic.IEnumerable>! source) -> System.Collections.Generic.IEnumerable! +static DotValid.Validated.FromNullable(T? value, System.Func! error) -> DotValid.Validated +static DotValid.Validated.FromNullable(T? value, System.Func! error) -> DotValid.Validated +static DotValid.Validated.FromNullable(T? value, TError error) -> DotValid.Validated +static DotValid.Validated.FromNullable(T? value, TError error) -> DotValid.Validated +static DotValid.Validated.Partition(this System.Collections.Generic.IEnumerable>! source) -> (System.Collections.Generic.IReadOnlyList! Values, System.Collections.Generic.IReadOnlyList! Errors) +static DotValid.Validated.Sequence(this System.Collections.Generic.IEnumerable>! source) -> DotValid.Validated!, TError> +static DotValid.Validated.Traverse(this System.Collections.Generic.IEnumerable! source, System.Func>! selector) -> DotValid.Validated!, TError> +static DotValid.Validated.Values(this System.Collections.Generic.IEnumerable>! source) -> System.Collections.Generic.IEnumerable! +static DotValid.Validated.operator !=(DotValid.Validated left, DotValid.Validated right) -> bool +static DotValid.Validated.operator ==(DotValid.Validated left, DotValid.Validated right) -> bool +static DotValid.ValidationError.operator !=(DotValid.ValidationError left, DotValid.ValidationError right) -> bool +static DotValid.ValidationError.operator ==(DotValid.ValidationError left, DotValid.ValidationError right) -> bool +~override DotValid.ValidationError.Equals(object obj) -> bool diff --git a/src/DotValid/PublicAPI.Unshipped.txt b/src/DotValid/PublicAPI.Unshipped.txt index 0faab25..7dc5c58 100644 --- a/src/DotValid/PublicAPI.Unshipped.txt +++ b/src/DotValid/PublicAPI.Unshipped.txt @@ -1,96 +1 @@ #nullable enable -DotValid.Invalid -DotValid.Invalid.Deconstruct(out System.Collections.Immutable.ImmutableArray errors) -> void -DotValid.Invalid.Equals(DotValid.Invalid other) -> bool -DotValid.Invalid.Errors.get -> System.Collections.Immutable.ImmutableArray -DotValid.Invalid.Invalid() -> void -DotValid.Invalid.Invalid(params System.ReadOnlySpan errors) -> void -DotValid.Invalid.Invalid(TError error) -> void -DotValid.Prelude -DotValid.Valid -DotValid.Valid.Deconstruct(out T value) -> void -DotValid.Valid.Equals(DotValid.Valid other) -> bool -DotValid.Valid.Valid() -> void -DotValid.Valid.Valid(T value) -> void -DotValid.Valid.Value.get -> T -DotValid.Validated -DotValid.Validated -DotValid.Validated.Ensure(System.Func! predicate, System.Func! error) -> DotValid.Validated -DotValid.Validated.Ensure(System.Func! predicate, TError error) -> DotValid.Validated -DotValid.Validated.Equals(DotValid.Validated other) -> bool -DotValid.Validated.IUnionMembers -DotValid.Validated.IUnionMembers.Create(DotValid.Invalid value) -> DotValid.Validated -DotValid.Validated.IUnionMembers.Create(DotValid.Valid value) -> DotValid.Validated -DotValid.Validated.IUnionMembers.TryGetValue(out DotValid.Invalid value) -> bool -DotValid.Validated.IUnionMembers.TryGetValue(out DotValid.Valid value) -> bool -DotValid.Validated.IUnionMembers.Value.get -> object? -DotValid.Validated.Map(System.Func! map) -> DotValid.Validated -DotValid.Validated.MapAsync(System.Func!>! map) -> System.Threading.Tasks.ValueTask> -DotValid.Validated.MapError(System.Func! map) -> DotValid.Validated -DotValid.Validated.Match(System.Func! valid, System.Func, TResult>! invalid) -> TResult -DotValid.Validated.MatchAsync(System.Func!>! valid, System.Func, System.Threading.Tasks.Task!>! invalid) -> System.Threading.Tasks.ValueTask -DotValid.Validated.MatchAsync(System.Func!>! valid, System.Func, TResult>! invalid) -> System.Threading.Tasks.ValueTask -DotValid.Validated.OrDefault(System.Func, T>! fallback) -> T -DotValid.Validated.OrDefault(T fallback) -> T -DotValid.Validated.Select(System.Func! selector) -> DotValid.Validated -DotValid.Validated.Then(System.Func>! next) -> DotValid.Validated -DotValid.Validated.ThenAsync(System.Func>!>! next) -> System.Threading.Tasks.ValueTask> -DotValid.Validated.Validated() -> void -DotValid.Validated.Zip(DotValid.Validated other, System.Func! combine) -> DotValid.Validated -DotValid.Validated.Zip(DotValid.Validated other) -> DotValid.Validated<(T, TOther), TError> -DotValid.ValidationError -DotValid.ValidationError.Deconstruct(out string! Property, out string! Message) -> void -DotValid.ValidationError.Equals(DotValid.ValidationError other) -> bool -DotValid.ValidationError.Message.get -> string! -DotValid.ValidationError.Property.get -> string! -DotValid.ValidationError.ValidationError() -> void -DotValid.ValidationError.ValidationError(string! Property, string! Message) -> void -override DotValid.Invalid.Equals(object? obj) -> bool -override DotValid.Invalid.GetHashCode() -> int -override DotValid.Invalid.ToString() -> string! -override DotValid.Valid.Equals(object? obj) -> bool -override DotValid.Valid.GetHashCode() -> int -override DotValid.Valid.ToString() -> string! -override DotValid.Validated.Equals(object? obj) -> bool -override DotValid.Validated.GetHashCode() -> int -override DotValid.Validated.ToString() -> string! -override DotValid.ValidationError.GetHashCode() -> int -override DotValid.ValidationError.ToString() -> string! -static DotValid.Invalid.operator !=(DotValid.Invalid left, DotValid.Invalid right) -> bool -static DotValid.Invalid.operator ==(DotValid.Invalid left, DotValid.Invalid right) -> bool -static DotValid.Prelude.invalid(params System.ReadOnlySpan errors) -> DotValid.Invalid -static DotValid.Prelude.invalid(TError error) -> DotValid.Invalid -static DotValid.Prelude.valid(T value) -> DotValid.Valid -static DotValid.Valid.operator !=(DotValid.Valid left, DotValid.Valid right) -> bool -static DotValid.Valid.operator ==(DotValid.Valid left, DotValid.Valid right) -> bool -static DotValid.Validated.Apply(this DotValid.Validated!, TError> function, DotValid.Validated argument) -> DotValid.Validated -static DotValid.Validated.Check(T value, System.Func! predicate, System.Func! error) -> DotValid.Validated -static DotValid.Validated.Check(T value, System.Func! predicate, TError error) -> DotValid.Validated -static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, DotValid.Validated fourth, DotValid.Validated fifth, DotValid.Validated sixth, DotValid.Validated seventh, DotValid.Validated eighth, System.Func! combine) -> DotValid.Validated -static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, DotValid.Validated fourth, DotValid.Validated fifth, DotValid.Validated sixth, DotValid.Validated seventh, System.Func! combine) -> DotValid.Validated -static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, DotValid.Validated fourth, DotValid.Validated fifth, DotValid.Validated sixth, System.Func! combine) -> DotValid.Validated -static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, DotValid.Validated fourth, DotValid.Validated fifth, System.Func! combine) -> DotValid.Validated -static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, DotValid.Validated fourth, System.Func! combine) -> DotValid.Validated -static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, DotValid.Validated third, System.Func! combine) -> DotValid.Validated -static DotValid.Validated.Combine(DotValid.Validated first, DotValid.Validated second, System.Func! combine) -> DotValid.Validated -static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Threading.Tasks.Task>! fourth, System.Threading.Tasks.Task>! fifth, System.Threading.Tasks.Task>! sixth, System.Threading.Tasks.Task>! seventh, System.Threading.Tasks.Task>! eighth, System.Func! combine) -> System.Threading.Tasks.ValueTask> -static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Threading.Tasks.Task>! fourth, System.Threading.Tasks.Task>! fifth, System.Threading.Tasks.Task>! sixth, System.Threading.Tasks.Task>! seventh, System.Func! combine) -> System.Threading.Tasks.ValueTask> -static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Threading.Tasks.Task>! fourth, System.Threading.Tasks.Task>! fifth, System.Threading.Tasks.Task>! sixth, System.Func! combine) -> System.Threading.Tasks.ValueTask> -static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Threading.Tasks.Task>! fourth, System.Threading.Tasks.Task>! fifth, System.Func! combine) -> System.Threading.Tasks.ValueTask> -static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Threading.Tasks.Task>! fourth, System.Func! combine) -> System.Threading.Tasks.ValueTask> -static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Threading.Tasks.Task>! third, System.Func! combine) -> System.Threading.Tasks.ValueTask> -static DotValid.Validated.CombineAsync(System.Threading.Tasks.Task>! first, System.Threading.Tasks.Task>! second, System.Func! combine) -> System.Threading.Tasks.ValueTask> -static DotValid.Validated.Errors(this System.Collections.Generic.IEnumerable>! source) -> System.Collections.Generic.IEnumerable! -static DotValid.Validated.FromNullable(T? value, System.Func! error) -> DotValid.Validated -static DotValid.Validated.FromNullable(T? value, System.Func! error) -> DotValid.Validated -static DotValid.Validated.FromNullable(T? value, TError error) -> DotValid.Validated -static DotValid.Validated.FromNullable(T? value, TError error) -> DotValid.Validated -static DotValid.Validated.Partition(this System.Collections.Generic.IEnumerable>! source) -> (System.Collections.Generic.IReadOnlyList! Values, System.Collections.Generic.IReadOnlyList! Errors) -static DotValid.Validated.Sequence(this System.Collections.Generic.IEnumerable>! source) -> DotValid.Validated!, TError> -static DotValid.Validated.Traverse(this System.Collections.Generic.IEnumerable! source, System.Func>! selector) -> DotValid.Validated!, TError> -static DotValid.Validated.Values(this System.Collections.Generic.IEnumerable>! source) -> System.Collections.Generic.IEnumerable! -static DotValid.Validated.operator !=(DotValid.Validated left, DotValid.Validated right) -> bool -static DotValid.Validated.operator ==(DotValid.Validated left, DotValid.Validated right) -> bool -static DotValid.ValidationError.operator !=(DotValid.ValidationError left, DotValid.ValidationError right) -> bool -static DotValid.ValidationError.operator ==(DotValid.ValidationError left, DotValid.ValidationError right) -> bool -~override DotValid.ValidationError.Equals(object obj) -> bool