Skip to content
Merged
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
2 changes: 1 addition & 1 deletion apiCount.include.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
**API count: 302**
**API count: 326**
28 changes: 28 additions & 0 deletions api_guard.include.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#### Guard

* `void DirectoryExists(String)`
* `void FileExists(String)`
* `void NotEmpty(String)`
* `void NotEmpty<T>(ReadOnlySpan<T>)`
* `void NotEmpty<T>(Span<T>)`
* `void NotEmpty<T>(Nullable<Memory<T>>)`
* `void NotEmpty<T>(Memory<T>)`
* `void NotEmpty<T>(Nullable<ReadOnlyMemory<T>>)`
* `void NotEmpty<T>(ReadOnlyMemory<T>)`
* `void NotEmpty<T>(T) where T : Collections.IEnumerable`
* `T NotNull<T>(T)`
* `String NotNull(String)`
* `String NotNullOrEmpty(String)`
* `T NotNullOrEmpty<T>(T) where T : Collections.IEnumerable`
* `Memory<Char> NotNullOrEmpty(Nullable<Memory<Char>>)`
* `ReadOnlyMemory<Char> NotNullOrEmpty(Nullable<ReadOnlyMemory<Char>>)`
* `String NotNullOrWhitespace(String)`
* `Memory<Char> NotNullOrWhitespace(Nullable<Memory<Char>>)`
* `ReadOnlyMemory<Char> NotNullOrWhitespace(Nullable<ReadOnlyMemory<Char>>)`
* `void NotWhitespace(String)`
* `void NotWhitespace(ReadOnlySpan<Char>)`
* `void NotWhitespace(Nullable<Memory<Char>>)`
* `void NotWhitespace(Nullable<ReadOnlyMemory<Char>>)`
* `void NotWhitespace(Span<Char>)`


48 changes: 38 additions & 10 deletions api_list.include.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@

#### ReadOnlySpan<T>

* `Boolean Contains<T>(T)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.contains#system-memoryextensions-contains-1(system-readonlyspan((-0))-0))
* `Boolean Contains<T>(T) where T : IEquatable<T>` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.contains#system-memoryextensions-contains-1(system-readonlyspan((-0))-0))


#### Reflection.EventInfo
Expand Down Expand Up @@ -269,7 +269,7 @@

#### Span<T>

* `Boolean Contains<T>(T)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.contains#system-memoryextensions-contains-1(system-span((-0))-0))
* `Boolean Contains<T>(T) where T : IEquatable<T>` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.contains#system-memoryextensions-contains-1(system-span((-0))-0))


#### Stream
Expand Down Expand Up @@ -391,14 +391,14 @@

#### EnumPolyfill

* `String[] GetNames<TEnum>()` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.getnames)
* `TEnum[] GetValues<TEnum>()` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.getvalues)
* `TEnum Parse<TEnum>(String)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
* `TEnum Parse<TEnum>(String, Boolean)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
* `TEnum Parse<TEnum>(ReadOnlySpan<Char>)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-readonlyspan((system-char))))
* `TEnum Parse<TEnum>(ReadOnlySpan<Char>, Boolean)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-readonlyspan((system-char))-system-boolean))
* `Boolean TryParse<TEnum>(ReadOnlySpan<Char>, TEnum&)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-0@))
* `Boolean TryParse<TEnum>(ReadOnlySpan<Char>, Boolean, TEnum&)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-system-boolean-0@))
* `String[] GetNames<TEnum>() where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.getnames)
* `TEnum[] GetValues<TEnum>() where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.getvalues)
* `TEnum Parse<TEnum>(String) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
* `TEnum Parse<TEnum>(String, Boolean) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
* `TEnum Parse<TEnum>(ReadOnlySpan<Char>) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-readonlyspan((system-char))))
* `TEnum Parse<TEnum>(ReadOnlySpan<Char>, Boolean) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-readonlyspan((system-char))-system-boolean))
* `Boolean TryParse<TEnum>(ReadOnlySpan<Char>, TEnum&) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-0@))
* `Boolean TryParse<TEnum>(ReadOnlySpan<Char>, Boolean, TEnum&) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-system-boolean-0@))


#### RegexPolyfill
Expand Down Expand Up @@ -521,3 +521,31 @@
* `Boolean TryParse(ReadOnlySpan<Char>, Globalization.NumberStyles, IFormatProvider, UInt16&)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.uint16.tryparse#system-uint16-tryparse(system-readonlyspan((system-char))-system-globalization-numberstyles-system-iformatprovider-system-uint16@))


#### Guard

* `void DirectoryExists(String)`
* `void FileExists(String)`
* `void NotEmpty(String)`
* `void NotEmpty<T>(ReadOnlySpan<T>)`
* `void NotEmpty<T>(Span<T>)`
* `void NotEmpty<T>(Nullable<Memory<T>>)`
* `void NotEmpty<T>(Memory<T>)`
* `void NotEmpty<T>(Nullable<ReadOnlyMemory<T>>)`
* `void NotEmpty<T>(ReadOnlyMemory<T>)`
* `void NotEmpty<T>(T) where T : Collections.IEnumerable`
* `T NotNull<T>(T)`
* `String NotNull(String)`
* `String NotNullOrEmpty(String)`
* `T NotNullOrEmpty<T>(T) where T : Collections.IEnumerable`
* `Memory<Char> NotNullOrEmpty(Nullable<Memory<Char>>)`
* `ReadOnlyMemory<Char> NotNullOrEmpty(Nullable<ReadOnlyMemory<Char>>)`
* `String NotNullOrWhitespace(String)`
* `Memory<Char> NotNullOrWhitespace(Nullable<Memory<Char>>)`
* `ReadOnlyMemory<Char> NotNullOrWhitespace(Nullable<ReadOnlyMemory<Char>>)`
* `void NotWhitespace(String)`
* `void NotWhitespace(ReadOnlySpan<Char>)`
* `void NotWhitespace(Nullable<Memory<Char>>)`
* `void NotWhitespace(Nullable<ReadOnlyMemory<Char>>)`
* `void NotWhitespace(Span<Char>)`


103 changes: 88 additions & 15 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ The package targets `netstandard2.0` and is designed to support the following ru
* `net5.0`, `net6.0`, `net7.0`, `net8.0`, `net9.0`


**API count: 302**<!-- singleLineInclude: apiCount. path: /apiCount.include.md -->
**API count: 326**<!-- singleLineInclude: apiCount. path: /apiCount.include.md -->


**See [Milestones](../../milestones?state=closed) for release notes.**
Expand Down Expand Up @@ -310,7 +310,7 @@ Reference: [CallerArgumentExpression](https://learn.microsoft.com/en-us/dotnet/c
<!-- snippet: CallerArgumentExpression -->
<a id='snippet-CallerArgumentExpression'></a>
```cs
static class Guard
static class FileUtil
{
public static void FileExists(string path, [CallerArgumentExpression("path")] string argumentName = "")
{
Expand All @@ -321,16 +321,16 @@ static class Guard
}
}

static class GuardUsage
static class FileUtilUsage
{
public static string[] Method(string path)
{
Guard.FileExists(path);
FileUtil.FileExists(path);
return File.ReadAllLines(path);
}
}
```
<sup><a href='/src/Tests/Guard.cs#L1-L22' title='Snippet source file'>snippet source</a> | <a href='#snippet-CallerArgumentExpression' title='Start of snippet'>anchor</a></sup>
<sup><a href='/src/Tests/CallerArgumentExpressionUsage.cs#L1-L22' title='Snippet source file'>snippet source</a> | <a href='#snippet-CallerArgumentExpression' title='Start of snippet'>anchor</a></sup>
<!-- endSnippet -->


Expand Down Expand Up @@ -603,7 +603,7 @@ The class `Polyfill` includes the following extension methods:

#### ReadOnlySpan<T>

* `Boolean Contains<T>(T)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.contains#system-memoryextensions-contains-1(system-readonlyspan((-0))-0))
* `Boolean Contains<T>(T) where T : IEquatable<T>` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.contains#system-memoryextensions-contains-1(system-readonlyspan((-0))-0))


#### Reflection.EventInfo
Expand Down Expand Up @@ -678,7 +678,7 @@ The class `Polyfill` includes the following extension methods:

#### Span<T>

* `Boolean Contains<T>(T)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.contains#system-memoryextensions-contains-1(system-span((-0))-0))
* `Boolean Contains<T>(T) where T : IEquatable<T>` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.contains#system-memoryextensions-contains-1(system-span((-0))-0))


#### Stream
Expand Down Expand Up @@ -800,14 +800,14 @@ The class `Polyfill` includes the following extension methods:

#### EnumPolyfill

* `String[] GetNames<TEnum>()` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.getnames)
* `TEnum[] GetValues<TEnum>()` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.getvalues)
* `TEnum Parse<TEnum>(String)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
* `TEnum Parse<TEnum>(String, Boolean)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
* `TEnum Parse<TEnum>(ReadOnlySpan<Char>)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-readonlyspan((system-char))))
* `TEnum Parse<TEnum>(ReadOnlySpan<Char>, Boolean)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-readonlyspan((system-char))-system-boolean))
* `Boolean TryParse<TEnum>(ReadOnlySpan<Char>, TEnum&)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-0@))
* `Boolean TryParse<TEnum>(ReadOnlySpan<Char>, Boolean, TEnum&)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-system-boolean-0@))
* `String[] GetNames<TEnum>() where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.getnames)
* `TEnum[] GetValues<TEnum>() where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.getvalues)
* `TEnum Parse<TEnum>(String) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
* `TEnum Parse<TEnum>(String, Boolean) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-string-system-boolean))
* `TEnum Parse<TEnum>(ReadOnlySpan<Char>) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-readonlyspan((system-char))))
* `TEnum Parse<TEnum>(ReadOnlySpan<Char>, Boolean) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.parse#system-enum-parse-1(system-readonlyspan((system-char))-system-boolean))
* `Boolean TryParse<TEnum>(ReadOnlySpan<Char>, TEnum&) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-0@))
* `Boolean TryParse<TEnum>(ReadOnlySpan<Char>, Boolean, TEnum&) where TEnum : Enum, ValueType` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.enum.tryparse#system-enum-tryparse-1(system-readonlyspan((system-char))-system-boolean-0@))


#### RegexPolyfill
Expand Down Expand Up @@ -929,6 +929,34 @@ The class `Polyfill` includes the following extension methods:
* `Boolean TryParse(ReadOnlySpan<Byte>, UInt16&)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.uint16.tryparse#system-uint16-tryparse(system-readonlyspan((system-char))-system-globalization-numberstyles-system-iformatprovider-system-uint16@))
* `Boolean TryParse(ReadOnlySpan<Char>, Globalization.NumberStyles, IFormatProvider, UInt16&)` [reference](https://learn.microsoft.com/en-us/dotnet/api/system.uint16.tryparse#system-uint16-tryparse(system-readonlyspan((system-char))-system-globalization-numberstyles-system-iformatprovider-system-uint16@))


#### Guard

* `void DirectoryExists(String)`
* `void FileExists(String)`
* `void NotEmpty(String)`
* `void NotEmpty<T>(ReadOnlySpan<T>)`
* `void NotEmpty<T>(Span<T>)`
* `void NotEmpty<T>(Nullable<Memory<T>>)`
* `void NotEmpty<T>(Memory<T>)`
* `void NotEmpty<T>(Nullable<ReadOnlyMemory<T>>)`
* `void NotEmpty<T>(ReadOnlyMemory<T>)`
* `void NotEmpty<T>(T) where T : Collections.IEnumerable`
* `T NotNull<T>(T)`
* `String NotNull(String)`
* `String NotNullOrEmpty(String)`
* `T NotNullOrEmpty<T>(T) where T : Collections.IEnumerable`
* `Memory<Char> NotNullOrEmpty(Nullable<Memory<Char>>)`
* `ReadOnlyMemory<Char> NotNullOrEmpty(Nullable<ReadOnlyMemory<Char>>)`
* `String NotNullOrWhitespace(String)`
* `Memory<Char> NotNullOrWhitespace(Nullable<Memory<Char>>)`
* `ReadOnlyMemory<Char> NotNullOrWhitespace(Nullable<ReadOnlyMemory<Char>>)`
* `void NotWhitespace(String)`
* `void NotWhitespace(ReadOnlySpan<Char>)`
* `void NotWhitespace(Nullable<Memory<Char>>)`
* `void NotWhitespace(Nullable<ReadOnlyMemory<Char>>)`
* `void NotWhitespace(Span<Char>)`

<!-- endInclude -->


Expand Down Expand Up @@ -1047,6 +1075,51 @@ Enable by adding and MSBuild property `PolyNullability`
* Throws an exception if state is `NullabilityState.Unknown`.


## Guard

Enable by adding and MSBuild property `PolyGuard`

```
<PropertyGroup>
...
<PolyGuard>true</PolyGuard>
</PropertyGroup>
```


`Polyfills.Guard` provides the following APIs:


#### Guard<!-- include: api_guard. path: /api_guard.include.md -->

* `void DirectoryExists(String)`
* `void FileExists(String)`
* `void NotEmpty(String)`
* `void NotEmpty<T>(ReadOnlySpan<T>)`
* `void NotEmpty<T>(Span<T>)`
* `void NotEmpty<T>(Nullable<Memory<T>>)`
* `void NotEmpty<T>(Memory<T>)`
* `void NotEmpty<T>(Nullable<ReadOnlyMemory<T>>)`
* `void NotEmpty<T>(ReadOnlyMemory<T>)`
* `void NotEmpty<T>(T) where T : Collections.IEnumerable`
* `T NotNull<T>(T)`
* `String NotNull(String)`
* `String NotNullOrEmpty(String)`
* `T NotNullOrEmpty<T>(T) where T : Collections.IEnumerable`
* `Memory<Char> NotNullOrEmpty(Nullable<Memory<Char>>)`
* `ReadOnlyMemory<Char> NotNullOrEmpty(Nullable<ReadOnlyMemory<Char>>)`
* `String NotNullOrWhitespace(String)`
* `Memory<Char> NotNullOrWhitespace(Nullable<Memory<Char>>)`
* `ReadOnlyMemory<Char> NotNullOrWhitespace(Nullable<ReadOnlyMemory<Char>>)`
* `void NotWhitespace(String)`
* `void NotWhitespace(ReadOnlySpan<Char>)`
* `void NotWhitespace(Nullable<Memory<Char>>)`
* `void NotWhitespace(Nullable<ReadOnlyMemory<Char>>)`
* `void NotWhitespace(Span<Char>)`

<!-- endInclude -->


## Alternatives


Expand Down
1 change: 1 addition & 0 deletions src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
<ResolveAssemblyReferencesSilent>true</ResolveAssemblyReferencesSilent>
<PolyNullability>true</PolyNullability>
<PolyGuard>true</PolyGuard>
<NuGetAuditMode>all</NuGetAuditMode>
<NuGetAuditLevel>low</NuGetAuditLevel>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
Expand Down
41 changes: 41 additions & 0 deletions src/Polyfill/Guard.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// <auto-generated />

namespace Polyfills;

using System.Runtime.CompilerServices;

#pragma warning disable

#if PolyGuard

using System;
using System.IO;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;

[ExcludeFromCodeCoverage]
[DebuggerNonUserCode]
#if PolyPublic
public
#endif
static partial class Guard
{
public static void FileExists(string path, [CallerArgumentExpression("path")] string argumentName = "")
{
NotNullOrEmpty(path, argumentName);
if (!File.Exists(path))
{
throw new ArgumentException($"File not found. Path: {path}", argumentName);
}
}

public static void DirectoryExists(string path, [CallerArgumentExpression("path")] string argumentName = "")
{
NotNullOrEmpty(path, argumentName);
if (!Directory.Exists(path))
{
throw new ArgumentException($"Directory not found. Path: {path}", argumentName);
}
}
}
#endif
Loading