Comments (4)
I must admit I haven't actually used the library yet. I found it in awesome-source-generators list.
Discriminated unions is something I try to replicate in C# quite often and I found that your library is the closest to how I would do it :) It seems like that it's evolved somehow since then.
I prefer making the base class abstract
and the cases sealed
as I don't think that an instance of Animal
would make sense without actually being either Dog
or Cat
in my example. If approached through abstract
base, StatusCode
(in your example) would have to be extended in each case and it makes the whole thing ugly. I do see exhaustive Match
as a big benefit of your approach. However, I do believe that switch
is important to make the library more approachable and idiomatic.
TL;DR: trade offs :) I can see how your approach works and if you'r ok with it then there's no need in my suggestion.
from dunet.
I actually didn't know that partial
can set abstract
. I tested with this in mind and it does work :)
The common property accessor would make case construction more uniform but I guess it's not a big deal. Consider your example:
var one = new HttpResponse<string>.Ok("Hello") { StatusCode = 200 };
var two = new HttpResponse<string>.Ok(200, "Hello");
one.StatusCode;
two.StatusCode; // if all cases have a property named StatusCode of int
Feel free to re-open if you find it a useful upgrade :)
Overall, a great library!
from dunet.
Hey, I really appreciate you taking the time to contribute your idea!
I am a big fan of how typescript treats union types as well.
What do you see as the benefit of supporting this pattern over just declaring a member in the union record itself? For example, I've done something like this at work:
[Union]
public partial record HttpResponse<T>
{
// A status code is part of all HTTP responses.
public required int StatusCode { get; init; }
public partial record Ok(T Content);
public partial record BadRequest(string Message);
public partial record ServerError;
}
I'd use it something like this:
using var client = new HttpClient();
var httpResponse = await GetContentAsync(client, "/some-api");
var message = httpResult.Match(
ok => $"Success ({ok.StatusCode}). Content: '{ok.Content}'",
badRequest => $"Bad request ({badRequest.StatusCode}). Error message: '{badRequest.Messsage}'";
serverError => $"Server error ({serverError.StatusCode})."
);
Console.WriteLine(message);
public static async Task GetContentAsync(HttpClient client, string endpoint)
{
using var response = client.GetAsync<SomeType>(endpoint);
using var contentJson = await response.Content.ReadAsStringAsync();
var content = JsonSerializer.Deserialize<SomeType>(content);
return new HttpResponse.Ok(content) { StatusCode = response.StatusCode };
}
from dunet.
I prefer making the base class
abstract
and the casessealed
as I don't think that an instance ofAnimal
would make sense without actually being eitherDog
orCat
in my example. If approached throughabstract
base,StatusCode
(in your example) would have to be extended in each case and it makes the whole thing ugly. I do see exhaustiveMatch
as a big benefit of your approach. However, I do believe thatswitch
is important to make the library more approachable and idiomatic.
The source generator actually makes the union record abstract
and its variants sealed
behind the scenes for you. :)
TL;DR: trade offs :) I can see how your approach works and if you'r ok with it then there's no need in my suggestion.
Sounds good. Would love to hear your feedback!
from dunet.
Related Issues (20)
- Inner union compile with error `Cannot implicitly convert type 'X' to 'Y` HOT 6
- Async match support HOT 2
- Add `Action` based `Match` (or similarly named) method HOT 5
- Async Action Match
- Do not generate implicit conversions if argument is an interface
- Disable CS1591 in generated code
- Record struct union support HOT 8
- Anonymous union variants
- Match on a specific union value only
- Unwrap union types HOT 2
- Simplify instantiation of generic-bound union members HOT 1
- Idea: Friendly use of ToString() HOT 4
- Allow matching with static functions
- Implicit conversions clash with required union properties HOT 1
- Separate Attributes into another project HOT 4
- Question: make it to work with asp net HOT 6
- Prefer `_ is _ _` pattern HOT 1
- Add Action with the type in the else of a MatchXYZ HOT 7
- Annotate Generated Code with GeneratedCodeAttribute
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from dunet.