{"id":37048919,"url":"https://github.com/andrej-dyck/dotnet-extensions-require","last_synced_at":"2026-01-14T05:41:31.980Z","repository":{"id":39995605,"uuid":"493355158","full_name":"andrej-dyck/dotnet-extensions-require","owner":"andrej-dyck","description":"📦 Require Expressions - A pre-condition checks library for .Net via extensions methods on types.","archived":false,"fork":false,"pushed_at":"2022-11-11T14:23:30.000Z","size":36,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-09T03:25:26.171Z","etag":null,"topics":["argument-checks","code-contracts","csharp","dotnet","extension-methods","guard","nuget-package","preconditions","require"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andrej-dyck.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-05-17T17:45:08.000Z","updated_at":"2023-04-27T12:49:30.000Z","dependencies_parsed_at":"2022-09-02T12:41:45.370Z","dependency_job_id":null,"html_url":"https://github.com/andrej-dyck/dotnet-extensions-require","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/andrej-dyck/dotnet-extensions-require","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrej-dyck%2Fdotnet-extensions-require","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrej-dyck%2Fdotnet-extensions-require/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrej-dyck%2Fdotnet-extensions-require/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrej-dyck%2Fdotnet-extensions-require/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrej-dyck","download_url":"https://codeload.github.com/andrej-dyck/dotnet-extensions-require/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrej-dyck%2Fdotnet-extensions-require/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28411116,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T05:26:33.345Z","status":"ssl_error","status_checked_at":"2026-01-14T05:21:57.251Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["argument-checks","code-contracts","csharp","dotnet","extension-methods","guard","nuget-package","preconditions","require"],"created_at":"2026-01-14T05:41:31.420Z","updated_at":"2026-01-14T05:41:31.976Z","avatar_url":"https://github.com/andrej-dyck.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Require Expressions for .Net\n\n![build](https://github.com/andrej-dyck/template-gradle-kotlin/actions/workflows/gradle-ci.yml/badge.svg?branch=main)\n[![codecov](https://codecov.io/gh/andrej-dyck/dotnet-extensions-require/branch/main/graph/badge.svg?token=9IL6K5CX37)](https://codecov.io/gh/andrej-dyck/dotnet-extensions-require)\n[![NuGet](https://badgen.net/nuget/v/Require-Expressions)](https://www.nuget.org/packages/Require-Expressions/)\n\nA small library that provides _pre-condition_ checks as an extension method on types.\nThis allows the client code to check a condition on arguments and use the value directly if no exception is thrown.\n\n```csharp\nReservation Request(DateTime now, DateTime reservationDate, int seats) =\u003e \n    new Reservation(\n        reservationDate.Require(d =\u003e d \u003e now, d =\u003e $\"Reservation date {d} must be in the future\"),\n        seats.Require(seats \u003e 0, () =\u003e \"Expected positive number of seats\")\n    );\n```\n\n## NuGet Package\n\n```shell\ndotnet add package Require-Expressions\n```\n\n## Examples for `Require`\n\nBasic `Require` function\n\n```csharp\nvar requestedSeats = seats.Require(condition: seats \u003e 0);\n// throws ArgumentException with \"expected: seats \u003e 0\" as message when condition is not met\n\nvar requestedSeats = seats.Require(\n    condition: seats \u003e 0,\n    expectation: \"Expected positive number of seats\" // or with custom expectation message\n);\n```\n\n`Require` functions with lazily constructed expectation messages\n\n```csharp\nvar requestedSeats = seats.Require(\n    condition: seats \u003e 0,\n    expectation: () =\u003e \"Expected positive number of seats\"\n);\n\nvar requestedDate = reservationDate.Require(\n    condition: reservationDate \u003e now,\n    expectation: d =\u003e $\"Reservation date {d} must be in the future\"\n);\n```\n\n`Require` functions with predicate for convenience\n\n```csharp\nvar requestedSeats = seats.Require(condition: s =\u003e s \u003e 0);\n// throws ArgumentException with \"expected: s =\u003e s \u003e 0\" as message when condition is not met\n\nvar requestedSeats = seats.Require(\n    condition: s =\u003e s \u003e 0,\n    expectation: \"Expected positive number of seats\" // or with custom expectation message\n);\n\nvar requestedDate = reservationDate.Require(\n    requirement: d =\u003e d \u003e now,\n    expectation: d =\u003e $\"Reservation date {d} must be in the future\"\n);\n```\n\n## Examples for `Check`\n\nFor checks other than on arguments, the `Check` function can be used\n\n```csharp\nvar reservationRequest = JsonSerializer.Deserialize\u003cReservation\u003e(request)\n    .Check(requirement: r =\u003e r.Seats \u003e 0) // expectation message will be \"expected r =\u003e r.Seats \u003e 0\"\n    .Check(r =\u003e r.Date \u003e now, r =\u003e $\"Reservation date {r.Date} must be in the future\")\n    // throws CheckFailed with expectation as message when requirement is not satisfied\n```\n\nWith `Check`, custom exceptions can be constructed\n\n```csharp\nvar reservationRequest = JsonSerializer.Deserialize\u003cReservation\u003e(request)\n    .Check(r =\u003e r.Seats \u003e 0, exception: () =\u003e new SeatsMustBePositive())\n    .Check(r =\u003e r.Date \u003e now, exception: r =\u003e new MustBeFutureDateReservateion(r.Date))\n```\n\n## Q\u0026A\n\n**Why yet another preconditions library?**\n\nMost libraries I found use precondition _statements_, while I found preconditions as _expressions_ more useful.\nFor example, the latter allows for [_expression-bodied_ functions](\nhttps://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members\n).\n\n**I don't like extension methods**\n\nNo problem, there are many other great precondition libraries. Have a look\nat [.Net's contracts](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.contracts?view=net-6.0).\n\n**I don't want yet another dependency**\n\nNo problem, just copy\u0026paste the code you need into your project. Or use the build-in .Net contracts.\n\n**Can you add this function too?**\n\nProbably not as I want to keep this library small and focused. But you are very welcome to post a PR.\n\n## Build \u0026 Test\n\n**Build project**\n\n```shell\ndotnet build \n```\n\n**Run unit tests**\n\n```shell\ndotnet test\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrej-dyck%2Fdotnet-extensions-require","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrej-dyck%2Fdotnet-extensions-require","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrej-dyck%2Fdotnet-extensions-require/lists"}