Skip to content

Commit 79d5c09

Browse files
committed
Support result return from paramless action
1 parent 6d91895 commit 79d5c09

File tree

7 files changed

+80
-5
lines changed

7 files changed

+80
-5
lines changed

Core/Cleipnir.ResilientFunctions.Tests/InMemoryTests/RFunctionTests/SunshineTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
using System.Threading.Tasks;
2-
using Cleipnir.ResilientFunctions.Helpers;
3-
using Cleipnir.ResilientFunctions.Storage;
42
using Microsoft.VisualStudio.TestTools.UnitTesting;
53

64
namespace Cleipnir.ResilientFunctions.Tests.InMemoryTests.RFunctionTests;
@@ -16,6 +14,10 @@ public override Task SunshineScenarioFunc()
1614
public override Task SunshineScenarioParamless()
1715
=> SunshineScenarioParamless(FunctionStoreFactory.Create());
1816

17+
[TestMethod]
18+
public override Task SunshineScenarioParamlessWithResultReturnType()
19+
=> SunshineScenarioParamlessWithResultReturnType(FunctionStoreFactory.Create());
20+
1921
[TestMethod]
2022
public override Task SunshineScenarioFuncWithState()
2123
=> SunshineScenarioFuncWithState(FunctionStoreFactory.Create());

Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/RFunctionTests/SunshineTests.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,37 @@ public async Task SunshineScenarioParamless(Task<IFunctionStore> storeTask)
8080

8181
unhandledExceptionHandler.ThrownExceptions.ShouldBeEmpty();
8282
}
83+
84+
public abstract Task SunshineScenarioParamlessWithResultReturnType();
85+
public async Task SunshineScenarioParamlessWithResultReturnType(Task<IFunctionStore> storeTask)
86+
{
87+
var store = await storeTask;
88+
var functionTypeId = TestFunctionId.Create().TypeId;
89+
var unhandledExceptionHandler = new UnhandledExceptionCatcher();
90+
91+
using var functionsRegistry = new FunctionsRegistry(store, new Settings(unhandledExceptionHandler.Catch));
92+
var flag = new SyncedFlag();
93+
var registration = functionsRegistry
94+
.RegisterParamless(
95+
functionTypeId,
96+
inner: () =>
97+
{
98+
flag.Raise();
99+
return Result.Succeed.ToTask();
100+
})
101+
.Invoke;
102+
103+
await registration("SomeInstanceId");
104+
flag.Position.ShouldBe(FlagPosition.Raised);
105+
106+
var storedFunction = await store.GetFunction(new FunctionId(functionTypeId, functionInstanceId: "SomeInstanceId"));
107+
storedFunction.ShouldNotBeNull();
108+
storedFunction.Status.ShouldBe(Status.Succeeded);
109+
storedFunction.Result.ShouldBeNull();
110+
storedFunction.Parameter.ShouldBeNull();
111+
112+
unhandledExceptionHandler.ThrownExceptions.ShouldBeEmpty();
113+
}
83114

84115
public abstract Task SunshineScenarioFuncWithState();
85116
public async Task SunshineScenarioFuncWithState(Task<IFunctionStore> storeTask)

Core/Cleipnir.ResilientFunctions/Domain/Result.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ private Result(bool succeed, Postpone? postpone, Exception? fail, Suspend? suspe
4141

4242
public Result<Unit?> ToUnit() => Outcome switch
4343
{
44-
Outcome.Succeed => new Result<Unit?>(Unit.Instance),
44+
Outcome.Succeed => new Result<Unit?>(succeedWithValue: default),
4545
Outcome.Postpone => new Result<Unit?>(Postpone!),
4646
Outcome.Fail => new Result<Unit?>(Fail!),
4747
Outcome.Suspend => new Result<Unit?>(Suspend!),

Core/Cleipnir.ResilientFunctions/InnerAdapters/InnerToAsyncResultAdapters.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,36 @@ internal static class InnerToAsyncResultAdapters
4040
};
4141
}
4242

43+
public static Func<Unit?, Workflow, Task<Result<Unit?>>> ToInnerParamlessWithTaskResultReturn(Func<Task<Result>> inner)
44+
{
45+
return async (_, _) =>
46+
{
47+
try
48+
{
49+
var result = await inner();
50+
return result.ToUnit();
51+
}
52+
catch (PostponeInvocationException exception) { return Postpone.Until(exception.PostponeUntil); }
53+
catch (SuspendInvocationException exception) { return Suspend.While(exception.ExpectedInterruptCount.Value); }
54+
catch (Exception exception) { return Fail.WithException(exception); }
55+
};
56+
}
57+
58+
public static Func<Unit?, Workflow, Task<Result<Unit?>>> ToInnerParamlessWithTaskResultReturn(Func<Workflow, Task<Result>> inner)
59+
{
60+
return async (_, workflow) =>
61+
{
62+
try
63+
{
64+
var result = await inner(workflow);
65+
return result.ToUnit();
66+
}
67+
catch (PostponeInvocationException exception) { return Postpone.Until(exception.PostponeUntil); }
68+
catch (SuspendInvocationException exception) { return Suspend.While(exception.ExpectedInterruptCount.Value); }
69+
catch (Exception exception) { return Fail.WithException(exception); }
70+
};
71+
}
72+
4373
// ** !! ACTION !! ** //
4474
// ** SYNC ** //
4575
public static Func<TParam, Workflow, Task<Result<Unit?>>> ToInnerActionWithTaskResultReturn<TParam>(Action<TParam> inner) where TParam : notnull

Stores/MySQL/Cleipnir.ResilientFunctions.MySQL.Tests/RFunctionTests/SunshineTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@ public override Task SunshineScenarioFunc()
1212
[TestMethod]
1313
public override Task SunshineScenarioParamless()
1414
=> SunshineScenarioParamless(FunctionStoreFactory.Create());
15-
15+
16+
[TestMethod]
17+
public override Task SunshineScenarioParamlessWithResultReturnType()
18+
=> SunshineScenarioParamlessWithResultReturnType(FunctionStoreFactory.Create());
19+
1620
[TestMethod]
1721
public override Task SunshineScenarioFuncWithState()
1822
=> SunshineScenarioFuncWithState(FunctionStoreFactory.Create());

Stores/PostgreSQL/Cleipnir.ResilientFunctions.PostgreSQL.Tests/RFunctionTests/SunshineTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ public override Task SunshineScenarioFunc()
1313
[TestMethod]
1414
public override Task SunshineScenarioParamless()
1515
=> SunshineScenarioParamless(FunctionStoreFactory.Create());
16+
17+
[TestMethod]
18+
public override Task SunshineScenarioParamlessWithResultReturnType()
19+
=> SunshineScenarioParamlessWithResultReturnType(FunctionStoreFactory.Create());
1620

1721
[TestMethod]
1822
public override Task SunshineScenarioFuncWithState()

Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer.Tests/RFunctionTests/SunshineTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ public override Task SunshineScenarioFunc()
1313
[TestMethod]
1414
public override Task SunshineScenarioParamless()
1515
=> SunshineScenarioParamless(FunctionStoreFactory.Create());
16-
16+
17+
[TestMethod]
18+
public override Task SunshineScenarioParamlessWithResultReturnType()
19+
=> SunshineScenarioParamlessWithResultReturnType(FunctionStoreFactory.Create());
20+
1721
[TestMethod]
1822
public override Task SunshineScenarioFuncWithState()
1923
=> SunshineScenarioFuncWithState(FunctionStoreFactory.Create());

0 commit comments

Comments
 (0)