# `JsonRemedy.Layer3.SyntaxNormalization`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L1)

Layer 3: Syntax Normalization - Fixes JSON syntax issues using character-by-character parsing.

This layer handles:
- Quote normalization (single → double quotes)
- Unquoted keys (add missing quotes)
- Boolean/null normalization (True/False/None → true/false/null)
- Comma and colon fixes (trailing commas, missing commas/colons)

Uses character-by-character parsing to be context-aware and preserve string content.

# `layer_result`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L34)

```elixir
@type layer_result() :: JsonRemedy.LayerBehaviour.layer_result()
```

# `parse_state`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L43)

```elixir
@type parse_state() :: %{
  result: String.t(),
  position: non_neg_integer(),
  in_string: boolean(),
  escape_next: boolean(),
  string_quote: String.t() | nil,
  repairs: [repair_action()],
  context_stack: [:object | :array],
  expecting: :key | :value | :colon | :comma_or_end
}
```

# `repair_action`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L32)

```elixir
@type repair_action() :: JsonRemedy.LayerBehaviour.repair_action()
```

# `repair_context`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L33)

```elixir
@type repair_context() :: JsonRemedy.LayerBehaviour.repair_context()
```

# `syntax_rule`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L37)

```elixir
@type syntax_rule() :: %{
  name: String.t(),
  processor: (String.t() -&gt; {String.t(), [repair_action()]}),
  condition: (String.t() -&gt; boolean()) | nil
}
```

# `apply_rule`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L272)

```elixir
@spec apply_rule(input :: String.t(), rule :: syntax_rule()) ::
  {String.t(), [repair_action()]}
```

Apply a single syntax rule with context awareness.

# `default_rules`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L256)

```elixir
@spec default_rules() :: [syntax_rule()]
```

Get default syntax normalization rules.

# `fix_colons`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L310)

```elixir
@spec fix_colons(input :: String.t()) :: {String.t(), [repair_action()]}
```

Add missing colons in object key-value pairs.

# `fix_commas`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L244)

```elixir
@spec fix_commas(input :: String.t()) :: {String.t(), [repair_action()]}
```

Public API function to fix commas only.

# `get_position_info`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L342)

```elixir
@spec get_position_info(input :: String.t(), position :: non_neg_integer()) :: %{
  line: pos_integer(),
  column: pos_integer(),
  context: String.t()
}
```

Get position information for error reporting.

# `inside_string?`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L265)

```elixir
@spec inside_string?(input :: String.t(), position :: non_neg_integer()) :: boolean()
```

Check if a position in the input is inside a string literal.
Used to avoid applying repairs to string content.

# `name`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L107)

```elixir
@spec name() :: String.t()
```

Return a human-readable name for this layer.

# `normalize_booleans`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L194)

```elixir
@spec normalize_booleans(input :: String.t()) :: {String.t(), [repair_action()]}
```

Public API function to normalize booleans only.

# `normalize_literals`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L299)

```elixir
@spec normalize_literals(input :: String.t()) :: {String.t(), [repair_action()]}
```

Normalize boolean and null literals.

# `normalize_quotes`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L169)

```elixir
@spec normalize_quotes(input :: String.t()) :: {String.t(), [repair_action()]}
```

Public API function to normalize quotes only.

# `priority`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L101)

```elixir
@spec priority() :: 3
```

Return the priority order for this layer.
Layer 3 (Syntax Normalization) should run after structural repair.

# `process`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L68)

```elixir
@spec process(input :: String.t(), context :: repair_context()) :: layer_result()
```

Process input string and apply Layer 3 syntax normalization repairs.

# `quote_unquoted_keys`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L284)

```elixir
@spec quote_unquoted_keys(input :: String.t()) :: {String.t(), [repair_action()]}
```

Add quotes around unquoted keys.

# `supports?`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L58)

```elixir
@spec supports?(input :: String.t()) :: boolean()
```

Check if this layer can handle the given input.

# `validate_options`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L113)

```elixir
@spec validate_options(options :: keyword()) :: :ok | {:error, String.t()}
```

Validate layer configuration and options.

# `validate_rule`
[🔗](https://github.com/nshkrdotcom/json_remedy/blob/v0.2.1/lib/json_remedy/layer3/syntax_normalization.ex#L321)

```elixir
@spec validate_rule(rule :: syntax_rule()) :: :ok | {:error, String.t()}
```

Validate that a syntax rule is well-formed.

---

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