harn-stdlib 0.10.77

Embedded Harn standard library source catalog
Documentation
import { ExternalActionAdapter, ExternalActionAdapterResult } from "std/external_action/contracts"

/**
 * Build a deterministic adapter with inspectable dispatch/reconcile call counts.
 *
 * @effects: [state.mutate]
 * @errors: []
 */
pub fn external_action_fake_adapter(
  runtime: HarnessRuntime,
  id: string,
  dispatch_result: ExternalActionAdapterResult,
  reconcile_results: list<ExternalActionAdapterResult> = [],
) -> dict {
  const dispatch_calls = runtime.atomic(0)
  const reconcile_calls = runtime.atomic(0)
  let cursor = 0
  const adapter = {
    id: id,
    dispatch: { _harness, _request ->
      runtime.atomic_add(dispatch_calls, 1)
      return dispatch_result
    },
    reconcile: { _harness, _request ->
      runtime.atomic_add(reconcile_calls, 1)
      if cursor >= len(reconcile_results) {
        return {
          outcome: "indeterminate",
          provider_action_id: nil,
          evidence_refs: nil,
          error_code: "fixture_exhausted",
        }
      }
      const result = reconcile_results[cursor]
      cursor = cursor + 1
      return result
    },
  }
  return {
    adapter: schema_expect(adapter, schema_of(ExternalActionAdapter)),
    dispatch_calls: fn() { return runtime.atomic_get(dispatch_calls) },
    reconcile_calls: fn() { return runtime.atomic_get(reconcile_calls) },
  }
}