# `Statifier.Machine.Content.Send`
[🔗](https://github.com/riddler/statifier-ex/blob/v2.0.0/lib/statifier/machine/content/send.ex#L1)

A compiled `<send>` executable-content node (spec 6.2) - the interned
counterpart to `Statifier.Document.Send`.

`event`, `target`, `type`, and `delay` each fold their own static/expr
attribute pair into a single `Machine.expr() | nil`, mirroring
`Statifier.Machine.Invoke.type`/`.src`: `{:static, v}` from
`event`/`target`/`type`/`delay`, `{:compiled, ...}` from
`eventexpr`/`targetexpr`/`typeexpr`/`delayexpr`, `nil` when neither
sibling was written (an already-validated document never writes both -
6.2.1's "Must not occur with" pairs).

`id` is the author's literal `id` attribute, used verbatim
(ADR-0008 as amended). `idlocation` stays a **raw, uncompiled location
path string**, never a compiled expression - `Statifier.Machine.Invoke.idlocation`'s
own moduledoc gives the reason: a location path cannot be resolved any
earlier than execute time, even in principle.

`namelist` and `params` are kept as two separate lists of
`Statifier.Machine.Param.t()`, every `namelist` entry compiled with
`kind: :location` - the same split `Statifier.Machine.Invoke` keeps for
its own `namelist`/`params`, so the validator can enforce 6.2.1's
"namelist Must not occur with the `<param>` element". A `namelist` entry
that fails to compile as a location expression does not fail
`Statifier.Compiler.compile/1`: it carries `{:invalid, error}` on the
entry's `expr` (5.9.4 deferral, see `Statifier.Machine.Param`) and is
discarded at execute time - `resolve_params/2` below - rather than at load
time.

`content` folds `<content>`'s markup into a single `Machine.expr()`,
exactly as `Machine.Invoke.content` and `Machine.Donedata.expr` do - `nil`
when `<send>` has no `<content>` child.

`attribute_locations` is `Statifier.Document.Send`'s own map, carried
through unchanged rather than distilled into individual `*_location`
fields - the same call `Statifier.Machine.Invoke`'s moduledoc makes for
its own eight source attributes.

Its `Statifier.ExecutableContent` implementation lives right below the
struct: this file is the whole node, top to bottom, with no dispatcher
anywhere else in the tree.

# `t`

```elixir
@type t() :: %Statifier.Machine.Content.Send{
  attribute_locations: Statifier.Document.attribute_locations(),
  c_index: non_neg_integer(),
  content: Statifier.Machine.expr() | nil,
  delay: Statifier.Machine.expr() | nil,
  event: Statifier.Machine.expr() | nil,
  id: String.t() | nil,
  idlocation: String.t() | nil,
  location: Statifier.Parser.Location.t(),
  namelist: [Statifier.Machine.Param.t()],
  params: [Statifier.Machine.Param.t()],
  target: Statifier.Machine.expr() | nil,
  type: Statifier.Machine.expr() | nil
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
