This document provides practical examples using skail.
Each example illustrates key patterns such as human approvals, automatic workflows, retry policies, compensating sagas, fan-out/fan-in orchestration, and event-driven logic.
1. Parallel Human Approval (Function + Command)
[SkailFunction]publicasyncSkailTaskAwaitAllHumanApprovals(GuidapprovalTaskId){awaitSendApprovalRequestEmail("Finance",approvalTaskId);awaitSendApprovalRequestEmail("Legal",approvalTaskId);awaitSendApprovalRequestEmail("Executive",approvalTaskId);varapprovals=new[]{SkailEvent.WaitForEvent<ApprovalResponse>("EVT_APPROVAL_FINANCE",approvalTaskId),SkailEvent.WaitForEvent<ApprovalResponse>("EVT_APPROVAL_LEGAL",approvalTaskId),SkailEvent.WaitForEvent<ApprovalResponse>("EVT_APPROVAL_EXECUTIVE",approvalTaskId)};varresults=awaitSkailTask.WhenAll(approvals);if(results.All(r=>r.Approved))awaitNotifyApproved(approvalTaskId);elseawaitNotifyDenied(approvalTaskId,results.First(r=>!r.Approved).Reason);}[SkailCommand]publicasyncSkailTaskSendApprovalRequestEmail(stringdepartment,GuidtaskId){varlink=$"https://portal.company.com/approvals/{department.ToLower()}/{taskId}";awaitEmailService.SendAsync($"{department} - Pending Approval",$"Please review the request at: {link}");}
2. Human Approval with Timeout
3. CT-e Issuance Pipeline (Function + Commands)
4. Compensating Workflow (Saga Pattern)
5. Durable Retry with Backoff
6. Race Between Providers (WhenAny)
7. Fan-out / Fan-in Data Aggregation
8. Human Approval Followed by Automation (Hybrid)
Note: Adapt these examples to your environment’s orchestration model, domain constraints, and versioning strategy.
[SkailFunction]
public async SkailTask WaitForApprovalWithTimeout(Guid approvalId)
{
await SendApprovalEmail(approvalId);
var approvalTask = SkailEvent.WaitForEvent<ApprovalResponse>("EVT_APPROVAL", approvalId);
var timeoutTask = SkailTask.DelayHours(72);
var result = await SkailTask.WhenAny(approvalTask, timeoutTask);
if (result == approvalTask)
await NotifyApproved(approvalId);
else
await NotifyExpired(approvalId);
}
[SkailCommand]
public async SkailTask SendApprovalEmail(Guid approvalId)
{
var link = $"https://portal.company.com/approve/{approvalId}";
await EmailService.SendAsync("Approval Required", $"Click here to approve: {link}");
}
[SkailFunction]
public async SkailTask IssueCTe(Guid cteId)
{
var cte = await BuildCTeModel(cteId);
await ValidateCTe(cte);
await SendToSefaz(cte);
await SaveCTe(cte);
}
[SkailCommand]
public async SkailTask<CTeModel> BuildCTeModel(Guid cteId)
{
var data = await CTeRepository.LoadDataAsync(cteId);
return new CTeModelBuilder().FromData(data).Build();
}
[SkailCommand]
public async SkailTask ValidateCTe(CTeModel cte)
{
await XmlSchemaValidator.ValidateAsync(cte.Xml);
}
[SkailCommand]
public async SkailTask SendToSefaz(CTeModel cte)
{
var response = await SefazApi.SubmitAsync(cte.Xml);
cte.AuthorizationProtocol = response.Protocol;
}
[SkailCommand]
public async SkailTask SaveCTe(CTeModel cte)
{
await CTeRepository.SaveAsync(cte);
}