Packages

WadmClient is a library for working with Wasmcloud's WADM service via nats

Current section

Files

Jump to
wadm_client lib wadm_client.ex
Raw

lib/wadm_client.ex

defmodule WadmClient do
@moduledoc """
Documentation for `WadmClient`.
"""
alias WadmClient.Conn
@type success :: {:ok, map}
@type error :: {:error, :timeout} | {:error, :no_responders} | {:error, map}
@type result :: success | error
@spec from_gnat(Gnat.t(), binary, binary | nil) :: Conn.t()
def from_gnat(gnat_connection, lattice, prefix) do
Conn.new(gnat_connection, lattice, prefix)
end
@spec list_manifests(Conn.t()) :: result
def list_manifests(conn) do
conn.conn
|> Gnat.request(model_list_topic(conn.lattice, conn.prefix), "")
|> parse_response()
end
@spec put_manifest(Conn.t(), map) :: result
def put_manifest(conn, manifest) do
body = Jason.encode!(manifest)
conn.conn
|> Gnat.request(model_put_topic(conn.lattice, conn.prefix), body,
headers: [{"Content-Type", "application/json"}]
)
|> parse_response()
end
@spec list_versions(Conn.t(), binary) :: result
def list_versions(conn, manifest) do
conn.conn
|> Gnat.request(model_versions_topic(conn.lattice, conn.prefix, manifest), "")
|> parse_response()
end
@spec get_manifest(Conn.t(), binary, binary | nil) :: result
def get_manifest(conn, manifest, version \\ nil) do
body = format_version(version)
conn.conn
|> Gnat.request(model_get_topic(conn.lattice, conn.prefix, manifest), body)
|> parse_response()
end
@spec delete_manifest(Conn.t(), binary, binary | nil) :: result
def delete_manifest(conn, manifest, version \\ nil) do
body = format_version(version)
conn.conn
|> Gnat.request(model_delete_topic(conn.lattice, conn.prefix, manifest), body)
|> parse_response()
end
@spec deploy_manifest(Conn.t(), binary, binary | nil) :: result
def deploy_manifest(conn, manifest, version \\ nil) do
body = format_version(version)
conn.conn
|> Gnat.request(model_deploy_topic(conn.lattice, conn.prefix, manifest), body)
|> parse_response()
end
@spec undeploy_manifest(Conn.t(), binary, binary | nil) :: result
def undeploy_manifest(conn, manifest, version \\ nil) do
body = format_version(version)
conn.conn
|> Gnat.request(model_undeploy_topic(conn.lattice, conn.prefix, manifest), body)
|> parse_response()
end
@spec get_manifest_status(Conn.t(), binary) :: result
def get_manifest_status(conn, manifest) do
conn.conn
|> Gnat.request(model_status_topic(conn.lattice, conn.prefix, manifest), "")
|> parse_response()
end
@spec parse_response({:ok, Gnat.message()} | {:error, :timeout} | {:error, :no_responders}) ::
result
defp parse_response({:ok, %{body: body}}) do
case Jason.decode!(body) do
%{"result" => "error"} = error -> {:error, error}
data -> {:ok, data}
end
end
defp parse_response(other), do: other
@spec format_version(binary | nil) :: binary
defp format_version(nil), do: ""
defp format_version(version), do: Jason.encode!(%{version: version})
defp model_list_topic(lattice, prefix) do
"#{model_prefix(lattice, prefix)}.list"
end
defp model_get_topic(lattice, prefix, model_name) do
"#{model_prefix(lattice, prefix)}.get.#{model_name}"
end
defp model_put_topic(lattice, prefix) do
"#{model_prefix(lattice, prefix)}.put"
end
defp model_delete_topic(lattice, prefix, model_name) do
"#{model_prefix(lattice, prefix)}.del.#{model_name}"
end
defp model_deploy_topic(lattice, prefix, model_name) do
"#{model_prefix(lattice, prefix)}.deploy.#{model_name}"
end
defp model_undeploy_topic(lattice, prefix, model_name) do
"#{model_prefix(lattice, prefix)}.undeploy.#{model_name}"
end
defp model_versions_topic(lattice, prefix, model_name) do
"#{model_prefix(lattice, prefix)}.versions.#{model_name}"
end
defp model_status_topic(lattice, prefix, model_name) do
"#{model_prefix(lattice, prefix)}.status.#{model_name}"
end
defp model_prefix(lattice, prefix) do
"#{prefix}.#{lattice}.model"
end
end