lib/atproto/bsky/schemas/profile_viewer_state.ex

defmodule ATProto.BSky.ProfileViewerState do
  use Ecto.Schema
  import Ecto.Changeset

  @primary_key false
  embedded_schema do
    field :muted, :boolean
    field :following, :string
    field :followed_by, :string
  end

  def changeset(schema, attrs) do
    attrs = underscore_keys(attrs)

    schema
    |> cast(attrs, [:muted, :following, :followed_by])
  end

  defp underscore_keys(map) do
    for {key, val} <- map, into: %{} do
      {Macro.underscore(key), val}
    end
  end
end