HostKit.Provider behaviour (host_kit v0.1.0-beta.0)

Copy Markdown View Source

Provider behaviour for HostKit integrations.

Providers own resource types, schemas, planning, applying, and optional DSL modules. This follows Terraform's provider/resource split while staying Elixir-native.

Summary

Callbacks

apply(change, context)

(optional)
@callback apply(change :: HostKit.Change.t(), context :: map()) ::
  :ok | :ignore | {:error, term()}

dsl_modules()

(optional)
@callback dsl_modules() :: [module()]

plan(resource, actual, context)

(optional)
@callback plan(resource :: struct(), actual :: struct() | nil, context :: map()) ::
  {:ok, [HostKit.Change.t()]} | :ignore | {:error, term()}

provider_name()

@callback provider_name() :: atom()

read(resource, context)

(optional)
@callback read(resource :: struct(), context :: map()) ::
  {:ok, struct() | nil} | :ignore | {:error, term()}

render(resource, context)

(optional)
@callback render(resource :: struct(), context :: map()) ::
  {:ok, iodata()} | :ignore | {:error, term()}

resource_types()

(optional)
@callback resource_types() :: [atom()]

validate(resource, context)

(optional)
@callback validate(resource :: struct(), context :: map()) ::
  :ok | :ignore | {:error, term()}

Functions

apply(providers, change, context \\ %{})

@spec apply([module()], HostKit.Change.t(), map()) :: :ok | {:error, term()}

dsl_modules(providers)

@spec dsl_modules([module()]) :: [module()]

render(providers, resource, context \\ %{})

@spec render([module()], struct(), map()) :: {:ok, iodata()} | {:error, term()}

resolve(opts_or_providers \\ [])

@spec resolve([module()] | keyword()) :: [module()]

validate(providers, resource, context \\ %{})

@spec validate([module()], struct(), map()) :: :ok | {:error, [term()]}