smokestack/lib/smokestack.ex

123 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.{ParamBuilder, RecordBuilder}
2023-08-10 21:01:45 +12:00
@type t :: module
@type recursive_atom_list :: atom | [atom | {atom, recursive_atom_list()}]
@doc """
Runs a factory and uses it to build a map or list of results.
Automatically implemented by modules which `use Smokestack`.
See `Smokestack.ParamBuilder.build/2` for more information.
"""
@callback params(Resource.t(), ParamBuilder.param_options()) ::
{:ok, ParamBuilder.param_result()} | {:error, any}
@doc """
Raising version of `params/2`.
Automatically implemented by modules which `use Smokestack`.
See `Smokestack.ParamBuilder.build/3` for more information.
"""
@callback params!(Resource.t(), ParamBuilder.param_options()) ::
ParamBuilder.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.RecordBuilder.build/3` for more information.
"""
@callback insert(Resource.t(), RecordBuilder.insert_options()) ::
{:ok, Resource.record()} | {:error, any}
@doc """
Raising version of `insert/4`.
Automatically implemented by modules which `use Smokestack`.
See `Smokestack.RecordBuilder.build/3` for more information.
"""
@callback insert!(Resource.t(), RecordBuilder.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.ParamBuilder.build/3` for more information.
"""
@spec params(Resource.t(), ParamBuilder.param_options()) ::
{:ok, ParamBuilder.param_result()} | {:error, any}
def params(resource, options \\ []),
do: ParamBuilder.build(__MODULE__, resource, options)
@doc """
Raising version of `params/2`.
See `Smokestack.ParamBuilder.build/3` for more information.
"""
@spec params!(Resource.t(), ParamBuilder.param_options()) ::
ParamBuilder.param_result() | no_return
def params!(resource, options \\ []),
do: ParamBuilder.build!(__MODULE__, resource, options)
@doc """
Execute the matching factory and return an inserted Ash Resource record.
See `Smokestack.RecordBuilder.build/3` for more information.
"""
@spec insert(Resource.t(), RecordBuilder.insert_options()) ::
{:ok, Resource.record()} | {:error, any}
def insert(resource, options \\ []),
do: RecordBuilder.build(__MODULE__, resource, options)
@doc """
Raising version of `insert/2`.
See `Smokestack.RecordBuilder.build/3` for more information.
"""
@spec insert!(Resource.t(), RecordBuilder.insert_options()) ::
Resource.record() | no_return
def insert!(resource, options \\ []),
do: RecordBuilder.build!(__MODULE__, resource, options)
2023-08-18 20:46:27 +12:00
defoverridable params: 2,
params!: 2,
insert: 2,
insert!: 2
end
] ++ super(opts)
end
2023-08-09 20:18:46 +12:00
end