smokestack/lib/smokestack.ex

118 lines
3.6 KiB
Elixir
Raw Normal View History

2023-08-09 20:18:46 +12:00
defmodule Smokestack do
2023-08-10 21:01:45 +12:00
alias Spark.{Dsl, Dsl.Extension}
2023-08-09 20:18:46 +12:00
@moduledoc """
2023-08-10 21:01:45 +12:00
<!--- ash-hq-hide-start --> <!--- -->
## DSL Documentation
### Index
2023-08-09 20:18:46 +12:00
2023-08-10 21:01:45 +12:00
#{Extension.doc_index(Smokestack.Dsl.sections())}
2023-08-09 20:18:46 +12:00
2023-08-10 21:01:45 +12:00
### Docs
2023-08-09 20:18:46 +12:00
2023-08-10 21:01:45 +12:00
#{Extension.doc(Smokestack.Dsl.sections())}
<!--- ash-hq-hide-stop --> <!--- -->
2023-08-09 20:18:46 +12:00
"""
2023-08-10 21:01:45 +12:00
use Dsl, default_extensions: [extensions: [Smokestack.Dsl]]
alias Ash.Resource
alias Smokestack.Builder
2023-08-10 21:01:45 +12:00
@type t :: module
@doc """
Runs a factory and uses it to build a map or list of results.
Automatically implemented by modules which `use Smokestack`.
See `Smokestack.Builder.params/5` for more information.
"""
@callback params(Resource.t(), map, atom, Builder.param_options()) ::
{:ok, Builder.param_result()} | {:error, any}
@doc """
Raising version of `params/4`.
Automatically implemented by modules which `use Smokestack`.
See `Smokestack.Builder.params/5` for more information.
"""
@callback params!(Resource.t(), map, atom, Builder.param_options()) ::
Builder.param_result() | no_return
@doc """
Runs a factory and uses it to insert an Ash Resource into it's data layer.
Automatically implemented by modules which `use Smokestack`.
See `Smokestack.Builder.insert/5` for more information.
"""
@callback insert(Resource.t(), map, atom, Builder.insert_options()) ::
{:ok, Resource.record()} | {:error, any}
@doc """
Raising version of `insert/4`.
Automatically implemented by modules which `use Smokestack`.
See `Smokestack.Builder.insert/5` for more information.
"""
@callback insert!(Resource.t(), map, atom, Builder.insert_options()) ::
Resource.record() | no_return
@doc false
defmacro __using__(opts) do
[
quote do
@behaviour Smokestack
@doc """
Execute the matching factory and return a map or list of params.
See `Smokestack.Builder.params/5` for more information.
"""
@spec params(Resource.t(), map, atom, Builder.param_options()) ::
{:ok, Builder.param_result()} | {:error, any}
def params(resource, overrides \\ %{}, variant \\ :default, options \\ []),
do: Builder.params(__MODULE__, resource, overrides, variant, options)
@doc """
Raising version of `params/4`.
See `Smokestack.Builder.params/5` for more information.
"""
@spec params!(Resource.t(), map, atom, Builder.param_options()) ::
Builder.param_result() | no_return
def params!(resource, overrides \\ %{}, variant \\ :default, options \\ []),
do: Builder.params!(__MODULE__, resource, overrides, variant, options)
@doc """
Execute the matching factory and return an inserted Ash Resource record.
See `Smokestack.Builder.insert/5` for more information.
"""
@spec insert(Resource.t(), map, atom, Builder.insert_options()) ::
{:ok, Resource.record()} | {:error, any}
def insert(resource, overrides \\ %{}, variant \\ :default, options \\ []),
do: Builder.insert(__MODULE__, resource, overrides, variant, options)
@doc """
Raising version of `insert/4`.
See `Smokestack.Builder.insert/5` for more information.
"""
@spec insert!(Resource.t(), map, atom, Builder.insert_options()) ::
Resource.record() | no_return
def insert!(resource, overrides \\ %{}, variant \\ :default, options \\ []),
do: Builder.insert!(__MODULE__, resource, overrides, variant, options)
defoverridable params: 4, params!: 4, insert: 4, insert!: 4
end
] ++ super(opts)
end
2023-08-09 20:18:46 +12:00
end