lib/genai/graph/legacy.node_protocol.ex

defprotocol GenAI.Legacy.NodeProtocol do
  def apply(node, thread_context)
end

defimpl GenAI.Legacy.NodeProtocol, for: [GenAI.Graph.Node] do
  def apply(node, thread_context)

  def apply(_, thread_context) do
    {:ok, thread_context}
  end
end

defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Tool do
  def apply(node, thread_context)

  def apply(node, thread_context) do
    GenAI.Thread.LegacyStateProtocol.apply_tool(thread_context, node)
  end
end

defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Setting do
  def apply(node, thread_context)

  def apply(node, thread_context) do
    GenAI.Thread.LegacyStateProtocol.apply_setting(thread_context, node)
  end
end

defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Setting.SafetySetting do
  def apply(node, thread_context)

  def apply(node, thread_context) do
    GenAI.Thread.LegacyStateProtocol.apply_safety_setting(thread_context, node)
  end
end

defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Setting.ModelSetting do
  def apply(node, thread_context)

  def apply(node, thread_context) do
    GenAI.Thread.LegacyStateProtocol.apply_model_setting(thread_context, node)
  end
end

defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Setting.ProviderSetting do
  def apply(node, thread_context)

  def apply(node, thread_context) do
    GenAI.Thread.LegacyStateProtocol.apply_provider_setting(thread_context, node)
  end
end

defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Model do
  def apply(node, thread_context)

  def apply(model_or_selector, thread_context) do
    cond do
      GenAI.ModelProtocol.impl_for(model_or_selector) ->
        with {:ok, {registered_model, thread_context}} <-
               GenAI.ModelProtocol.register(model_or_selector, thread_context) do
          GenAI.Thread.LegacyStateProtocol.apply_model(thread_context, registered_model)
        else
          x = {:error, _} -> x
          x -> {:error, {:unexpected, x}}
        end

      :else ->
        GenAI.Thread.LegacyStateProtocol.apply_model(thread_context, model_or_selector)
    end
  end
end



defimpl GenAI.Legacy.NodeProtocol, for: GenAI.ExternalModel do
  def apply(node, thread_context)
  
  def apply(model_or_selector, thread_context) do
    cond do
      GenAI.ModelProtocol.impl_for(model_or_selector) ->
        with {:ok, {registered_model, thread_context}} <-
               GenAI.ModelProtocol.register(model_or_selector, thread_context) do
          GenAI.Thread.LegacyStateProtocol.apply_model(thread_context, registered_model)
        else
          x = {:error, _} -> x
          x -> {:error, {:unexpected, x}}
        end
      
      :else ->
        GenAI.Thread.LegacyStateProtocol.apply_model(thread_context, model_or_selector)
    end
  end
end

defimpl GenAI.Legacy.NodeProtocol,
  for: [GenAI.Message, GenAI.Message.ToolUsage, GenAI.Message.ToolResponse] do
  def apply(node, thread_context)

  def apply(node, thread_context) do
    GenAI.Thread.LegacyStateProtocol.apply_message(thread_context, node)
  end
end

defimpl GenAI.Legacy.NodeProtocol, for: GenAI.Graph do
  def apply(this, thread_context) do
    Enum.reduce(this.nodes, {:ok, thread_context}, fn
      _, thread_context = {:error, _} ->
        thread_context

      node, {:ok, thread_context} ->
        GenAI.Legacy.NodeProtocol.apply(node, thread_context)
    end)
  end
end