defmodule Kinda.CodeGen.Type do
defstruct zig_t: nil,
module_name: nil,
kind_name: nil,
backer: nil,
fields: [],
kind_functions: []
def array_type_name(type) do
"[*c]const " <> type
end
def ptr_type_name(type) do
"[*c]" <> type
end
defp module_basename(%__MODULE__{module_name: module_name}) do
module_name |> Module.split() |> List.last() |> String.to_atom()
end
defp module_basename("c.struct_" <> struct_name) do
struct_name |> String.to_atom()
end
defp module_basename("isize") do
:ISize
end
defp module_basename("usize") do
:USize
end
defp module_basename("c_int") do
:CInt
end
defp module_basename("c_uint") do
:CUInt
end
defp module_basename("[*c]const u8") do
:CString
end
defp module_basename("?*anyopaque") do
:OpaquePtr
end
defp module_basename("?*const anyopaque") do
:OpaqueArray
end
defp module_basename("?fn(" <> _ = fn_name) do
raise "need module name for function type: #{fn_name}"
end
defp module_basename(type) when is_binary(type) do
type |> String.capitalize() |> String.to_atom()
end
def default(root_module, type) when is_binary(type) do
{:ok,
%__MODULE__{zig_t: type, module_name: Module.concat(root_module, module_basename(type))}}
end
def gen_resource_kind(%__MODULE__{module_name: module_name, zig_t: zig_t, kind_name: kind_name}) do
"""
pub const #{kind_name} = kinda.ResourceKind(#{zig_t}, "#{module_name}");
"""
end
end