Lightweight C# library for Go-like error handling
$ dotnet add package rslcsA lightweight C# library that brings Go-like error handling to .NET applications
dotnet add package rslcs
using rslcs;
Result<double> Divide(double a, double b)
{
if (b == 0)
{
return new(new DivideByZeroException("Cannot divide by zero"));
}
return new(a / b);
}
var result = Divide(10, 2);
if (result.Error != null)
{
Console.WriteLine($"Error: {result.Error.Message}");
return;
}
Console.WriteLine($"Result: {result.Value}");
var (value, error) = Divide(10, 0);
if (error != null)
{
Console.WriteLine($"Error: {error.Message}");
return;
}
Console.WriteLine($"Result: {value}");
var result = Divide(10, 2)
.Then(r => Divide(r, 5))
.Then(r => Divide(r, 2));
// Equivalent to:
var result = Divide(10, 2);
if (result.Error == null) return new(result.Error);
result = Divide(result.Value, 5);
if (result.Error == null) return new(result.Error);
return Divide(result.Value, 2);
async Task<Result<string>> FetchDataAsync(string url)
{
try
{
using HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(url);
if (!response.IsSuccessStatusCode)
{
return new(new HttpRequestException(
$"HTTP error! Status: {response.StatusCode}"));
}
string data = await response.Content.ReadAsStringAsync();
return new(data);
}
catch (Exception ex)
{
return new(ex);
}
}
// Usage
async Task ProcessDataAsync()
{
var (value, error) = await FetchDataAsync("https://api.example.com/data");
if (error != null)
{
Console.WriteLine($"Error: {error.Message}");
return;
}
Console.WriteLine($"Data: {value}");
}
MIT License