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) },
}
}