export function findStateById()

in src/asl-utils/asl/asl.ts [77:113]


export function findStateById<T extends StateDefinition>(
  asl: Asl<T>,
  stateId: StateId,
  branchPath: BranchPath = [],
): StateAddress<T> {
  if (!isAslWithStates(asl)) {
    return STATE_NOT_FOUND
  }

  const state = asl.States[stateId]
  if (state) {
    return { state, parent: asl, parentPath: branchPath, path: [...branchPath, stateId] }
  }

  for (const [childStateId, childState] of Object.entries(asl.States)) {
    if (isMap(childState)) {
      const iteratorProcessor = getProcessorDefinition<T, DistributedMapState<T>>(childState as DistributedMapState<T>)

      const result = findStateById(iteratorProcessor, stateId, [...branchPath, childStateId])
      if (result.state != null) {
        return result
      }
    }

    if (isParallel<T>(childState) && childState.Branches) {
      for (let branchIndex = 0; branchIndex < childState.Branches.length; branchIndex++) {
        const branch = childState.Branches[branchIndex]
        const result = findStateById(branch, stateId, [...branchPath, childStateId, branchIndex])
        if (result.state != null) {
          return result
        }
      }
    }
  }

  return STATE_NOT_FOUND
}