Extract product-agnostic workflow engine from Ablera.Serdica.Workflow into standalone StellaOps.Workflow.* libraries targeting net10.0. Libraries (14): - Contracts, Abstractions (compiler, decompiler, expression runtime) - Engine (execution, signaling, scheduling, projections, hosted services) - ElkSharp (generic graph layout algorithm) - Renderer.ElkSharp, Renderer.ElkJs, Renderer.Msagl, Renderer.Svg - Signaling.Redis, Signaling.OracleAq - DataStore.MongoDB, DataStore.PostgreSQL, DataStore.Oracle WebService: ASP.NET Core Minimal API with 22 endpoints Tests (8 projects, 109 tests pass): - Engine.Tests (105 pass), WebService.Tests (4 E2E pass) - Renderer.Tests, DataStore.MongoDB/Oracle/PostgreSQL.Tests - Signaling.Redis.Tests, IntegrationTests.Shared Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1.3 KiB
1.3 KiB
Tutorial 8: Expressions
The expression system enables declarative logic that compiles to portable canonical JSON. All expressions are evaluable at runtime without recompilation.
Path Navigation
| Prefix | Source | Example |
|---|---|---|
start.* |
Start request fields | start.policyId |
state.* |
Mutable workflow state | state.customerName |
payload.* |
Task completion payload | payload.answer |
result.* |
Step result (by resultKey) | result.productInfo.lob |
Built-in Functions
| Function | Description | Example |
|---|---|---|
coalesce |
First non-null | coalesce(state.id, start.id, 0) |
concat |
String join | concat("Policy #", state.policyNo) |
add |
Sum | add(state.attempt, 1) |
if |
Conditional | if(state.isVip, "VIP", "Standard") |
isNullOrWhiteSpace |
Null/empty check | isNullOrWhiteSpace(state.name) |
length |
String/array length | length(state.items) |
upper |
Uppercase | upper(state.annexType) |
first |
First array element | first(state.objects) |
mergeObjects |
Deep merge | mergeObjects(state, payload) |
Variants
Next
Tutorial 9: Testing — unit test setup with recording transports.