src/pocketflow/advanced_nodes

Advanced node types for PocketFlow

Provides conditional, loop, timeout, and other specialized node types.

Types

ConditionalNode = ref object of BaseNode
  conditionFunc*: proc (ctx: PfContext; params: JsonNode): Future[bool] {....gcsafe.}
  trueNode*: BaseNode
  falseNode*: BaseNode
Node that branches based on a condition
LoopNode = ref object of BaseNode
  itemsFunc*: proc (ctx: PfContext; params: JsonNode): Future[JsonNode] {....gcsafe.}
  bodyNode*: BaseNode
  maxIterations*: int
  aggregateResults*: bool
Node that loops over items
MapNode = ref object of BaseNode
  mapFunc*: proc (ctx: PfContext; item: JsonNode): Future[JsonNode] {....gcsafe.}
  maxConcurrency*: int
Maps a function over a collection
TimeoutNode = ref object of BaseNode
  innerNode*: BaseNode
  timeoutMs*: int
Wraps a node with timeout protection

Procs

proc newConditionalNode(condition: proc (ctx: PfContext; params: JsonNode): Future[
    bool] {....gcsafe.}; trueNode: BaseNode; falseNode: BaseNode = nil): ConditionalNode {.
    ...raises: [], tags: [], forbids: [].}
Creates a conditional node that branches based on a condition
proc newLoopNode(items: proc (ctx: PfContext; params: JsonNode): Future[JsonNode] {.
    ...gcsafe.}; body: BaseNode; maxIterations: int = 100;
                 aggregateResults: bool = true): LoopNode {....raises: [],
    tags: [], forbids: [].}
Creates a loop node that iterates over items
proc newMapNode(mapFunc: proc (ctx: PfContext; item: JsonNode): Future[JsonNode] {.
    ...gcsafe.}; maxConcurrency: int = 0): MapNode {....raises: [], tags: [],
    forbids: [].}
Creates a map node that applies a function to each item
proc newTimeoutNode(innerNode: BaseNode; timeoutMs: int): TimeoutNode {.
    ...raises: [], tags: [], forbids: [].}
Creates a timeout node that wraps another node

Methods

method internalRun(node: ConditionalNode; ctx: PfContext): Future[string] {.
    ...gcsafe, stackTrace: false, raises: [Exception, ValueError],
    tags: [RootEffect], forbids: [].}
method internalRun(node: LoopNode; ctx: PfContext): Future[string] {....gcsafe,
    stackTrace: false,
    raises: [Exception, ValueError, ValidationError, KeyError],
    tags: [RootEffect], forbids: [].}
method internalRun(node: MapNode; ctx: PfContext): Future[string] {....gcsafe,
    stackTrace: false,
    raises: [Exception, ValueError, ValidationError, KeyError],
    tags: [RootEffect], forbids: [].}
method internalRun(node: TimeoutNode; ctx: PfContext): Future[string] {....gcsafe,
    stackTrace: false, raises: [Exception, ValueError, TimeoutError],
    tags: [RootEffect, TimeEffect], forbids: [].}