lib/codegen/resource.ex

defmodule Kinda.CodeGen.Resource do
  alias Kinda.CodeGen.KindDecl

  def resource_type_struct(
        {:cptr,
         %Zig.Parser.PointerOptions{align: nil, const: true, volatile: false, allowzero: false},
         [type: type]},
        %{} = resource_kind_map
      ) do
    mod = Map.fetch!(resource_kind_map, type)
    "#{mod}.Array"
  end

  def resource_type_struct(
        {:cptr,
         %Zig.Parser.PointerOptions{align: nil, const: false, volatile: false, allowzero: false},
         [type: type]},
        %{} = resource_kind_map
      ) do
    mod = Map.fetch!(resource_kind_map, type)
    "#{mod}.Ptr"
  end

  def resource_type_struct(type, %{} = resource_kind_map) do
    mod = Map.fetch!(resource_kind_map, type)
    "#{mod}"
  end

  def resource_type_resource_kind(type, %{} = resource_kind_map) do
    resource_type_struct(type, resource_kind_map) <> ".resource"
  end

  def resource_type_var(type, %{} = resource_kind_map) do
    resource_type_resource_kind(type, resource_kind_map) <> ".t"
  end

  def resource_open(%KindDecl{kind_name: kind_name})
      when kind_name in ~w{USize OpaquePtr OpaqueArray} do
    """
    #{kind_name}.open_all(env);
    kinda.aliasKind(#{kind_name}, kinda.Internal.#{kind_name});
    """
  end

  def resource_open(%KindDecl{kind_name: kind_name}) do
    """
    #{kind_name}.open_all(env);
    """
  end
end