# LiveSchema
A comprehensive state management library for Phoenix LiveView with DSL, type checking, and deep Phoenix integration.
## Features
- **Schema DSL** - Define your state structure with a clean, expressive syntax
- **Type System** - Built-in types with runtime validation
- **Auto-generated Setters** - Reduce boilerplate with automatic setter functions
- **Actions** - Elm-style state transitions for complex updates
- **Phoenix Integration** - Seamless integration with LiveView and Components
- **Testing Utilities** - Helpers for testing state logic in isolation
## Installation
Add `live_schema` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:live_schema, "~> 0.0.1"}
]
end
```
## Quick Start
Define a state schema:
```elixir
defmodule MyAppWeb.PostsLive.State do
use LiveSchema
schema do
field :posts, {:list, Post}, default: []
field :selected, Post, null: true
field :loading, :boolean, default: false
embeds_one :filter do
field :status, {:enum, [:all, :active, :archived]}, default: :all
field :search, :string, default: ""
end
end
action :select_post, [:id] do
post = Enum.find(state.posts, &(&1.id == id))
set_selected(state, post)
end
action :update_filter, [:field, :value] do
update_in(state.filter, &Map.put(&1, field, value))
end
end
```
Use in your LiveView:
```elixir
defmodule MyAppWeb.PostsLive do
use MyAppWeb, :live_view
use LiveSchema.View, schema: __MODULE__.State
def mount(_params, _session, socket) do
{:ok, assign(socket, :state, State.new())}
end
def handle_event("select", %{"id" => id}, socket) do
state = State.apply(socket.assigns.state, {:select_post, String.to_integer(id)})
{:noreply, assign(socket, :state, state)}
end
end
```
## Documentation
- [Getting Started](guides/getting-started.md)
- [Schema DSL](guides/schema-dsl.md)
- [Actions](guides/actions.md)
- [Validation](guides/validation.md)
- [Phoenix Integration](guides/phoenix-integration.md)
- [Testing](guides/testing.md)
## License
MIT License - see [LICENSE](LICENSE) for details.