Packages

spark

1.0.7
2.7.2 2.7.1 2.7.0 2.6.1 2.6.0 2.5.0 2.4.1 2.4.0 2.3.14 2.3.13 2.3.12 2.3.11 2.3.10 2.3.9 2.3.8 2.3.7 2.3.6 2.3.5 2.3.4 2.3.3 2.3.2 2.3.1 2.3.0 2.2.69 2.2.68 2.2.67 2.2.66 2.2.65 2.2.64 2.2.63 2.2.62 2.2.61 2.2.60 2.2.59 2.2.58 2.2.57 2.2.56 2.2.55 2.2.54 2.2.53 2.2.52 2.2.51 2.2.50 2.2.49 2.2.48 2.2.47 2.2.46 2.2.45 2.2.44 2.2.43 2.2.42 2.2.41 2.2.40 2.2.39 2.2.38 2.2.37 2.2.36 2.2.35 2.2.34 2.2.33 2.2.32 2.2.31 2.2.30 2.2.29 2.2.28 2.2.27 2.2.26 2.2.25 2.2.24 2.2.23 2.2.22 2.2.21 2.2.20 2.2.19 2.2.18 2.2.17 2.2.16 2.2.15 2.2.14 2.2.13 2.2.12 2.2.11 2.2.10 2.2.9 2.2.8 2.2.7 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 2.2.1 2.2.0 2.1.24 2.1.23 2.1.22 2.1.21 2.1.20 2.1.19 2.1.18 2.1.17 2.1.16 2.1.15 2.1.14 2.1.13 2.1.12 2.1.11 2.1.10 2.1.9 2.1.8 2.1.7 2.1.6 2.1.5 2.1.4 2.1.3 2.1.2 2.1.1 2.1.0 2.0.1 2.0.0 1.1.55 1.1.54 1.1.53 1.1.52 1.1.51 1.1.50 1.1.49 1.1.48 1.1.47 1.1.46 1.1.45 1.1.44 1.1.43 1.1.42 1.1.41 1.1.40 1.1.39 1.1.38 1.1.37 1.1.36 1.1.35 1.1.34 1.1.32 1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.26 1.1.25 1.1.24 1.1.22 1.1.21 1.1.20 1.1.19 1.1.18 1.1.17 1.1.16 1.1.15 1.1.14 retired 1.1.13 1.1.12 1.1.11 1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.9 1.0.8 1.0.7 1.0.6 1.0.5 1.0.4 1.0.3 1.0.2 1.0.1 1.0.0 0.4.12 0.4.11 0.4.10 0.4.9 0.4.8 0.4.7 0.4.6 0.4.5 0.4.4 0.4.3 0.4.2 0.4.1 0.3.12 0.3.11 0.3.10 0.3.9 0.3.8 0.3.7 0.3.6 0.3.5 0.3.4 0.3.3 0.3.2 0.3.1 0.3.0 0.2.18 0.2.17 0.2.16 0.2.15 0.2.14 0.2.13 0.2.12 0.2.11 0.2.10 0.2.9 0.2.8 0.2.7 0.2.6 0.2.5 0.2.4 0.2.3 0.2.2 0.2.1 0.2.0 0.1.29 0.1.28 0.1.27 0.1.26 0.1.25 0.1.24 0.1.23 0.1.22 0.1.21 0.1.20 0.1.19 0.1.18 0.1.17 0.1.16 0.1.15 0.1.14 0.1.13 0.1.12 0.1.11 0.1.10 0.1.9 0.1.8 0.1.7 0.1.6 0.1.5 0.1.4 0.1.3 0.1.2 0.1.1 0.1.0

Generic tooling for building DSLs

Current section

Files

Jump to
spark lib spark dsl fragment.ex
Raw

lib/spark/dsl/fragment.ex

defmodule Spark.Dsl.Fragment do
@moduledoc """
Allows splitting up a DSL into multiple modules, potentially organizing large DSLs
Use the `of` option to expression what your fragment is a fragment of. You can add
extensions as you would normally to that resource, and they will be added to the
parent resource.
defmodule MyApp.Resource.Graphql do
use Spark.Dsl.Fragment, of: Ash.Resource, extensions: AshGraphql.Resource
graphql do
...
end
end
"""
defmacro __using__(opts) do
opts = Spark.Dsl.Extension.do_expand(opts, __CALLER__)
original_opts = opts
single_extension_kinds = opts[:of].single_extension_kinds()
many_extension_kinds = opts[:of].many_extension_kinds()
{opts, extensions} =
opts[:of].default_extension_kinds()
|> Enum.reduce(opts, fn {key, defaults}, opts ->
Keyword.update(opts, key, defaults, fn current_value ->
cond do
key in single_extension_kinds ->
current_value || defaults
key in many_extension_kinds || key == :extensions ->
List.wrap(current_value) ++ List.wrap(defaults)
true ->
current_value
end
end)
end)
|> Spark.Dsl.expand_modules(
[
single_extension_kinds: single_extension_kinds,
many_extension_kinds: many_extension_kinds
],
__CALLER__
)
Module.register_attribute(__CALLER__.module, :spark_extension_kinds, persist: true)
Module.register_attribute(__CALLER__.module, :spark_fragment_of, persist: true)
Module.put_attribute(__CALLER__.module, :spark_fragment_of, opts[:of])
Module.put_attribute(__CALLER__.module, :extensions, extensions)
Module.put_attribute(__CALLER__.module, :original_opts, original_opts)
Module.put_attribute(
__CALLER__.module,
:spark_extension_kinds,
List.wrap(many_extension_kinds) ++
List.wrap(single_extension_kinds)
)
quote do
require unquote(opts[:of])
unquote(Spark.Dsl.Extension.prepare(extensions))
@before_compile Spark.Dsl.Fragment
end
end
defmacro __before_compile__(_) do
quote do
Spark.Dsl.Extension.set_state([], false)
def extensions do
@extensions
end
def opts do
@original_opts
end
def spark_dsl_config do
@spark_dsl_config
end
end
end
end