I just did a dirty hack after seeing Zoi on x.com a few hours ago.
Quick Introduction
The zoi_defstruct is a library to help you generate a struct from the Zoi object schema (over Zoi.object). Let’s see a small example below:
defmodule K8S.Deployment do
use ZoiDefstruct
@schema Zoi.object(%{
apiVersion: Zoi.string(),
metadata:
Zoi.object(%{
name: Zoi.string()
}),
spec:
Zoi.object(%{
replicas: Zoi.integer() |> Zoi.optional()
})
})
defstructure(@schema)
end
When you call a defstructure The macro generates a struct with enforced keys and typespec for you automatically. So in the IEx, you can see:
A struct:
iex(4)> K8S.Deployment.__struct__()
%K8S.Deployment{spec: nil, metadata: nil, apiVersion: nil}
A typespec declaration:
iex(1)> t K8S.Deployment
@type t() :: %{
spec: %{optional(:replicas) => integer()},
metadata: %{name: binary()},
apiVersion: binary()
}
ArgumentError if it has no required keys:
iex(5)> %K8S.Deployment{}
** (ArgumentError) the following keys must also be given when building struct K8S.Depl
oyment: [:spec, :metadata, :apiVersion]
(examples 0.1.0) expanding struct: K8S.Deployment.__struct__/1
iex:5: (file)
Since this is a quick hack, it has numerous edge cases that need to be addressed. Please feel free to provide feedback or suggestions. Opening an issue or pull request is very welcome.
I need to give special thanks to Zoi for making this awesome library!






















