Packages

spark

2.2.24
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 section.ex
Raw

lib/spark/dsl/section.ex

defmodule Spark.Dsl.Section do
@moduledoc """
Declares a DSL section.
A dsl section allows you to organize related configurations. All extensions
configure sections, they cannot add DSL builders to the top level. This
keeps things organized, and concerns separated.
A section may have nested sections, which will be configured the same as other sections.
Getting the options/entities of a section is done by providing a path, so you would
use the nested path to retrieve that configuration. See `Spark.Dsl.Extension.get_entities/2`
and `Spark.Dsl.Extension.get_opt/4`.
A section may have entities, which are constructors that produce instances of structs.
For more on entities, see `Spark.Dsl.Entity`.
A section may also have a `schema`, which you can learn more about in `Spark.Options`. Spark will produce
builders for those options, so that they may be configured. They are retrieved with
`Spark.Dsl.Extension.get_opt/4`.
To create a section that is available at the top level (i.e not nested inside of its own name), use
`top_level?: true`. Remember, however, that this has no effect on sections nested inside of other sections.
For a full example, see `Spark.Dsl.Extension`.
"""
defstruct [
:name,
imports: [],
schema: [],
describe: "",
snippet: "",
links: nil,
examples: [],
modules: [],
top_level?: false,
no_depend_modules: [],
auto_set_fields: [],
deprecations: [],
entities: [],
sections: [],
docs: "",
patchable?: false
]
alias Spark.{
Dsl.Entity,
Dsl.Section
}
@type name :: atom()
@type imports :: [module]
@typedoc """
User provided documentation.
Documentation provided in a `Section`'s `describe` field will be included by `Spark` in any generated documentation that includes the `Section`.
"""
@type describe :: String.t()
@type snippet :: String.t()
@typedoc """
Determines whether a section can be declared directly in a module.
When `top_level?: true`, that Section's DSL can be declared outside of a `do` block in a module.
## Example
A `Section` declared with `top_level?: true`:
```elixir
@my_section %Spark.Dsl.Section{
top_level?: true,
name: :my_section,
schema: [my_field: [type: :atom, required: true]]
}
```
Can be declared like this:
```elixir
defmodule MyDslModule do
my_field :value
end
```
With `top_level?: false`, the DSL section would need to be declared explicitly/:
```elixir
defmodule MyDslModule do
my_section do
my_field :value
end
end
```
"""
@type top_level?() :: boolean()
@type links :: nil | keyword([String.t()])
@type examples() :: [String.t()]
@type modules :: [atom]
@type no_depend_modules() :: [atom]
@type auto_set_fields() :: keyword(any)
@type entities :: [Entity.t()]
@type sections :: [Section.t()]
@typedoc """
Internal field. Not set by user.
"""
@type docs :: String.t()
@type patchable? :: boolean()
@type t :: %Section{
name: name(),
imports: imports(),
schema: Spark.Options.schema(),
describe: describe(),
snippet: snippet(),
top_level?: top_level?(),
links: links(),
examples: examples(),
modules: modules(),
no_depend_modules: no_depend_modules(),
auto_set_fields: auto_set_fields(),
entities: entities(),
sections: sections(),
docs: docs(),
patchable?: patchable?()
}
end