# `Selecto.ViewPublisher`

Validates Selecto-authored published view specs before any DDL generation.

This keeps publication constraints separate from ordinary runtime query
validation so domains can register stable SQL view contracts explicitly.

# `publish_result`

```elixir
@type publish_result() ::
  {:ok,
   %{
     sql: String.t(),
     ddl: String.t(),
     kind: atom(),
     database_name: String.t(),
     index_statements: [String.t()]
   }}
  | {:error, [String.t()]}
```

# `refresh_result`

```elixir
@type refresh_result() :: :ok | {:error, term()}
```

# `validation_result`

```elixir
@type validation_result() :: :ok | {:error, [String.t()]}
```

# `build_sql`

```elixir
@spec build_sql(Selecto.Types.domain(), map()) :: publish_result()
```

# `ddl_for`

```elixir
@spec ddl_for(atom(), String.t(), String.t()) :: String.t()
```

# `index_statements`

```elixir
@spec index_statements(map()) :: [String.t()]
```

# `refresh`

```elixir
@spec refresh(Selecto.Types.domain(), map(), module(), term(), keyword()) ::
  refresh_result()
```

# `refresh_sql`

```elixir
@spec refresh_sql(
  String.t(),
  keyword()
) :: String.t()
```

# `validate`

```elixir
@spec validate(Selecto.Types.domain(), map()) :: validation_result()
```

---

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