Skip to content
Open
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: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,5 @@ Generated_Code #added for RIA/Silverlight projects
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML

\.idea/
14 changes: 10 additions & 4 deletions Chain/Chain.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@

using System;
using System;

namespace Chain
{
public abstract class Chain
{
public static OngoingChaining<T> Do<T>(Func<T> startFunction) where T : class
{
return new OngoingChaining<T>(startFunction());
try
{
return new OngoingChaining<T>(startFunction());
}
catch
{
return new OngoingChaining<T>(null);
}
}

public static OngoingChaining<T> Do<T>(T startObject) where T : class
{
return new OngoingChaining<T>(startObject);
}
}
}
}
32 changes: 30 additions & 2 deletions Chain/OngoingChaining.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,44 @@ namespace Chain
{
public class OngoingChaining<T> where T : class
{
private T _currentResult;
private T _currentResult;
private Action<Exception> _errorFallback;
private Action<Exception> _globalErrorFallback;

internal OngoingChaining(T currentResult)
{
_currentResult = currentResult;
}

public OngoingChaining<T> WithErrorFallback(Action<Exception> onError)
{
_errorFallback = onError;
return this;
}

public OngoingChaining<T> WithGlobalErrorFallback(Action<Exception> onError)
{
_globalErrorFallback = onError;
return this;
}

public OngoingChaining<TNext> Then<TNext>(Func<T, TNext> nextFunction) where TNext : class
{
return _currentResult != null ? new OngoingChaining<TNext>(nextFunction(_currentResult)) : new OngoingChaining<TNext>(null);
try
{
var result = _currentResult != null
? new OngoingChaining<TNext>(nextFunction(_currentResult))
: new OngoingChaining<TNext>(null);

_errorFallback = null;
return result;
}
catch (Exception ex)
{
_errorFallback?.Invoke(ex);
_globalErrorFallback?.Invoke(ex);
return null;
}
}

public OngoingChaining<T> OrElse(T fallback)
Expand Down