Skip to main content

src/webql/assembler/linker/link_route.gleam

import gleam/dynamic
import gleam/list
import webql/assembler/linker/program
import webql/graph

/// Links graph edges into scheduler program edges.
pub fn link(edges: List(graph.Edge)) -> List(program.Edge) {
  list.map(edges, fn(edge) {
    case edge {
      graph.Edge(
        source: graph.Output(path: from),
        target: graph.Input(path: to),
      ) ->
        program.Edge(
          source: program.Output(path: from),
          target: program.Input(path: to),
        )

      graph.Edge(
        source: graph.Literal(value: value),
        target: graph.Input(path: to),
      ) ->
        program.Edge(
          source: program.Literal(value: link_constant(value)),
          target: program.Input(path: to),
        )
    }
  })
}

// PRIVATE FUNCTIONS
// =================
fn link_constant(value: graph.Value) -> dynamic.Dynamic {
  case value {
    graph.Int(value:) -> dynamic.int(value)
    graph.Float(value:) -> dynamic.float(value)
    graph.String(value:) -> dynamic.string(value)
  }
}