Current section
Files
Jump to
Current section
Files
lib/codex/protocol/plugin/responses.ex
defmodule Codex.Protocol.Plugin.ListResponse do
@moduledoc """
Typed response for `plugin/list`.
"""
use TypedStruct
alias Codex.Protocol.Plugin.{Helpers, Marketplace, MarketplaceLoadError}
@key_mapping %{
"marketplace_load_errors" => "marketplaceLoadErrors",
"remote_sync_error" => "remoteSyncError",
"featured_plugin_ids" => "featuredPluginIds"
}
@known_fields ["marketplaces", "marketplaceLoadErrors", "remoteSyncError", "featuredPluginIds"]
@schema Zoi.map(
%{
"marketplaces" => Helpers.default_array(Helpers.any_map()),
"marketplaceLoadErrors" => Helpers.default_array(Helpers.any_map()),
"remoteSyncError" => Helpers.optional_string(),
"featuredPluginIds" => Helpers.default_string_list()
},
unrecognized_keys: :preserve
)
typedstruct do
field(:marketplaces, [Marketplace.t()], default: [])
field(:marketplace_load_errors, [MarketplaceLoadError.t()], default: [])
field(:remote_sync_error, String.t() | nil)
field(:featured_plugin_ids, [String.t()], default: [])
field(:extra, map(), default: %{})
end
@spec schema() :: Zoi.schema()
def schema, do: @schema
@spec parse(map() | keyword() | t()) ::
{:ok, t()}
| {:error, {:invalid_plugin_list_response, CliSubprocessCore.Schema.error_detail()}}
def parse(%__MODULE__{} = value), do: {:ok, value}
def parse(data),
do: Helpers.parse(@schema, data, :invalid_plugin_list_response, @key_mapping, &build/1)
@spec parse!(map() | keyword() | t()) :: t()
def parse!(%__MODULE__{} = value), do: value
def parse!(data),
do: Helpers.parse!(@schema, data, :invalid_plugin_list_response, @key_mapping, &build/1)
@spec from_map(map() | keyword() | t()) :: t()
def from_map(data), do: parse!(data)
@spec to_map(t()) :: map()
def to_map(%__MODULE__{} = value) do
%{
"marketplaces" => Helpers.encode_list(value.marketplaces, Marketplace),
"marketplaceLoadErrors" =>
Helpers.encode_list(value.marketplace_load_errors, MarketplaceLoadError),
"featuredPluginIds" => value.featured_plugin_ids
}
|> Helpers.maybe_put("remoteSyncError", value.remote_sync_error)
|> Map.merge(value.extra)
end
defp build(parsed) do
{known, extra} = Helpers.split_extra(parsed, @known_fields)
%__MODULE__{
marketplaces: Helpers.parse_list(Map.get(known, "marketplaces"), Marketplace),
marketplace_load_errors:
Helpers.parse_list(Map.get(known, "marketplaceLoadErrors"), MarketplaceLoadError),
remote_sync_error: Map.get(known, "remoteSyncError"),
featured_plugin_ids: Map.get(known, "featuredPluginIds", []),
extra: extra
}
end
end
defmodule Codex.Protocol.Plugin.ReadResponse do
@moduledoc """
Typed response for `plugin/read`.
"""
use TypedStruct
alias Codex.Protocol.Plugin.{Detail, Helpers}
@known_fields ["plugin"]
@schema Zoi.map(
%{"plugin" => Helpers.any_map()},
unrecognized_keys: :preserve
)
typedstruct do
field(:plugin, Detail.t(), enforce: true)
field(:extra, map(), default: %{})
end
@spec schema() :: Zoi.schema()
def schema, do: @schema
@spec parse(map() | keyword() | t()) ::
{:ok, t()}
| {:error, {:invalid_plugin_read_response, CliSubprocessCore.Schema.error_detail()}}
def parse(%__MODULE__{} = value), do: {:ok, value}
def parse(data), do: Helpers.parse(@schema, data, :invalid_plugin_read_response, %{}, &build/1)
@spec parse!(map() | keyword() | t()) :: t()
def parse!(%__MODULE__{} = value), do: value
def parse!(data),
do: Helpers.parse!(@schema, data, :invalid_plugin_read_response, %{}, &build/1)
@spec from_map(map() | keyword() | t()) :: t()
def from_map(data), do: parse!(data)
@spec to_map(t()) :: map()
def to_map(%__MODULE__{} = value) do
%{"plugin" => Detail.to_map(value.plugin)}
|> Map.merge(value.extra)
end
defp build(parsed) do
{known, extra} = Helpers.split_extra(parsed, @known_fields)
%__MODULE__{plugin: Helpers.parse_nested(Map.fetch!(known, "plugin"), Detail), extra: extra}
end
end
defmodule Codex.Protocol.Plugin.InstallResponse do
@moduledoc """
Typed response for `plugin/install`.
"""
use TypedStruct
alias Codex.Protocol.Plugin.{AppSummary, AuthPolicy, Helpers}
@key_mapping %{"auth_policy" => "authPolicy", "apps_needing_auth" => "appsNeedingAuth"}
@known_fields ["authPolicy", "appsNeedingAuth"]
@schema Zoi.map(
%{
"authPolicy" => AuthPolicy.schema(),
"appsNeedingAuth" => Helpers.default_array(Helpers.any_map())
},
unrecognized_keys: :preserve
)
typedstruct do
field(:auth_policy, AuthPolicy.t(), enforce: true)
field(:apps_needing_auth, [AppSummary.t()], default: [])
field(:extra, map(), default: %{})
end
@spec schema() :: Zoi.schema()
def schema, do: @schema
@spec parse(map() | keyword() | t()) ::
{:ok, t()}
| {:error, {:invalid_plugin_install_response, CliSubprocessCore.Schema.error_detail()}}
def parse(%__MODULE__{} = value), do: {:ok, value}
def parse(data) do
Helpers.parse(@schema, data, :invalid_plugin_install_response, @key_mapping, &build/1)
end
@spec parse!(map() | keyword() | t()) :: t()
def parse!(%__MODULE__{} = value), do: value
def parse!(data) do
Helpers.parse!(@schema, data, :invalid_plugin_install_response, @key_mapping, &build/1)
end
@spec from_map(map() | keyword() | t()) :: t()
def from_map(data), do: parse!(data)
@spec to_map(t()) :: map()
def to_map(%__MODULE__{} = value) do
%{
"authPolicy" => AuthPolicy.to_wire(value.auth_policy),
"appsNeedingAuth" => Helpers.encode_list(value.apps_needing_auth, AppSummary)
}
|> Map.merge(value.extra)
end
defp build(parsed) do
{known, extra} = Helpers.split_extra(parsed, @known_fields)
%__MODULE__{
auth_policy: Map.fetch!(known, "authPolicy"),
apps_needing_auth: Helpers.parse_list(Map.get(known, "appsNeedingAuth"), AppSummary),
extra: extra
}
end
end
defmodule Codex.Protocol.Plugin.UninstallResponse do
@moduledoc """
Typed response for `plugin/uninstall`.
"""
use TypedStruct
alias Codex.Protocol.Plugin.Helpers
@schema Zoi.map(%{}, unrecognized_keys: :preserve)
typedstruct do
field(:extra, map(), default: %{})
end
@spec schema() :: Zoi.schema()
def schema, do: @schema
@spec parse(map() | keyword() | t()) ::
{:ok, t()}
| {:error,
{:invalid_plugin_uninstall_response, CliSubprocessCore.Schema.error_detail()}}
def parse(%__MODULE__{} = value), do: {:ok, value}
def parse(data) do
Helpers.parse(@schema, data, :invalid_plugin_uninstall_response, %{}, &build/1)
end
@spec parse!(map() | keyword() | t()) :: t()
def parse!(%__MODULE__{} = value), do: value
def parse!(data) do
Helpers.parse!(@schema, data, :invalid_plugin_uninstall_response, %{}, &build/1)
end
@spec from_map(map() | keyword() | t()) :: t()
def from_map(data), do: parse!(data)
@spec to_map(t()) :: map()
def to_map(%__MODULE__{} = value), do: value.extra
defp build(parsed), do: %__MODULE__{extra: parsed}
end