# `RustQ.Meta.Typing`
[🔗](https://github.com/elixir-crab/rustq/blob/v1.0.0-rc.19/lib/rustq/meta/typing.ex#L1)

Synthesizes the type of a Rusty-Elixir expression and checks one against an expected type,
deciding the coercion lowering applies: propagating with `?`, wrapping in `Some`, borrowing,
dereferencing, or none.

# `env_source`

```elixir
@type env_source() :: RustQ.Meta.Typing.Env.t() | keyword()
```

# `check`

```elixir
@spec check(Macro.t(), RustQ.Meta.Type.t(), env_source()) ::
  RustQ.Meta.Typing.Check.t()
```

# `env`

```elixir
@spec env(keyword()) :: RustQ.Meta.Typing.Env.t()
```

# `expected_for_let`

```elixir
@spec expected_for_let(Macro.t(), Macro.t(), env_source()) ::
  RustQ.Meta.Type.t() | nil
```

# `infer_downstream_let_types`

```elixir
@spec infer_downstream_let_types([Macro.t()], env_source(), map()) :: %{
  optional(atom()) =&gt; RustQ.Meta.Type.t()
}
```

# `struct_field_type`

```elixir
@spec struct_field_type(RustQ.Meta.Type.t(), atom()) :: RustQ.Meta.Type.t() | nil
```

# `synth`

```elixir
@spec synth(Macro.t(), env_source()) :: RustQ.Meta.Type.t() | nil
```

---

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