<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="374613" data-post-id="374613">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="cschmatzler" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/cschmatzler/120/35101_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  cschmatzler
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>This is beautiful - can replace my hand-rolled version of this now. Thanks for contributing to the ecosystem <img src="https://forum.elixirforum.com/images/emoji/apple/smiling_face_with_three_hearts.png?v=15" title=":smiling_face_with_three_hearts:" class="emoji" alt=":smiling_face_with_three_hearts:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="374613" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/zoi-schema-validation-library-inspired-by-zod/72108/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-374613" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="374613"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #11"></div>
  </section>
</div>
    <div class="postbit" id="375159" data-post-id="375159">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="phcurado" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/phcurado/120/39030_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  phcurado
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h1><a name="p-375159-v066-release-rocket-1" class="anchor" href="#p-375159-v066-release-rocket-1" aria-label="Heading link" rel="nofollow"></a>v0.6.6 release <img src="https://forum.elixirforum.com/images/emoji/apple/rocket.png?v=15" title=":rocket:" class="emoji" alt=":rocket:" loading="lazy" width="20" height="20"></h1>
<p><code>Zoi</code> now supports a metadata option, allowing you to add additional information to your schema, which can be useful for documentation purposes.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">iex&gt; schema = Zoi.string(metadata: [id: "1", description: "A simple string"])
iex&gt; Zoi.metadata(schema)
[id: "1", description: "A simple string"]
</code></pre>
<p>You can use this feature to create self-documenting schemas, and also creating examples and testing them:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyApp.UserSchema do
  @schema Zoi.object(
            %{
              name: Zoi.string() |&gt; Zoi.min(2) |&gt; Zoi.max(100),
              age: Zoi.integer() |&gt; Zoi.optional()
            },
            metadata: [
              example: %{name: "Alice", age: 30},
              doc: "A user schema with name and optional age",
              moduledoc: "Schema representing a user with name and optional age"
            ]
          )

  @moduledoc """
  #{Zoi.metadata(@schema)[:moduledoc]}
  """

  @doc """
  #{Zoi.metadata(@schema)[:doc]}
  """
  def schema, do: @schema
end

defmodule MyApp.UserSchemaTest do
  use ExUnit.Case
  alias MyApp.UserSchema

  test "example matches schema" do
    example = Zoi.metadata(UserSchema.schema())[:example]
    assert {:ok, example} == Zoi.parse(UserSchema.schema(), example)
  end
end
</code></pre>
<h3><a name="p-375159-new-refinements-added-2" class="anchor" href="#p-375159-new-refinements-added-2" aria-label="Heading link" rel="nofollow"></a>New refinements added</h3>
<ul>
<li><code>Zoi.downcase/1</code> validate if a string is in lowercase</li>
<li><code>Zoi.upcase/1</code>  validate if a string is in uppercase</li>
<li><code>Zoi.hex/1</code> validate if a string is a valid hexadecimal</li>
</ul>
<p>Release v0.6.6: <a href="https://github.com/phcurado/zoi/releases/tag/v0.6.6" rel="noopener nofollow ugc">zoi</a> | <a href="https://hex.pm/packages/zoi/0.6.6" rel="nofollow">Hex</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="375159" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/zoi-schema-validation-library-inspired-by-zod/72108/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-375159" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="375159"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #12"></div>
  </section>
</div>
    <div class="postbit" id="375514" data-post-id="375514">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="phcurado" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/phcurado/120/39030_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  phcurado
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h1><a name="p-375514-v07-release-with-openapi-support-rocket-1" class="anchor" href="#p-375514-v07-release-with-openapi-support-rocket-1" aria-label="Heading link" rel="nofollow"></a>v0.7 release with OpenAPI support <img src="https://forum.elixirforum.com/images/emoji/apple/rocket.png?v=15" title=":rocket:" class="emoji" alt=":rocket:" loading="lazy" width="20" height="20"></h1>
<p>This new version introduces the new <code>Zoi.to_json_schema/1</code> function, which allows you to convert your <code>Zoi</code> schemas into JSON Schema format. This is useful for generating API documentation and other use cases where JSON Schema is required.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">schema = Zoi.object(%{
  name: Zoi.string(metadata: [description: "The name of the person"]),
})
Zoi.to_json_schema(schema)
# %{
#   "$schema": "https://json-schema.org/draft/2020-12/schema",
#   type: :object,
#   required: [:name],
#   properties: %{name: %{type: :string, description: "The name of the person"}},
#   additionalProperties: false
# }
</code></pre>
<p>This feature allow us to generate <a href="https://www.openapis.org/" rel="noopener nofollow ugc">OpenAPI</a> documentation from <code>Zoi</code> schemas, since the <a href="https://www.openapis.org/blog/2021/02/18/openapi-specification-3-1-released" rel="noopener nofollow ugc">3.1 version</a> is 100% compatible with JSON Schema.<br>
Checkout the <a href="https://hexdocs.pm/zoi/0.7.1/using_zoi_to_generate_openapi_specs.html" rel="noopener nofollow ugc">Zoi OpenAPI guide</a> for more details, it shows how to use <code>Zoi</code> with the <a href="https://hexdocs.pm/oaskit/index.html" rel="noopener nofollow ugc">Oaskit</a> library.</p>
<p>I also created a <a href="https://hexdocs.pm/zoi/quickstart_guide.html" rel="noopener nofollow ugc">quickstart guide</a> to help you get started with <code>Zoi</code>.</p>
<p>Release v0.7.1: <a href="https://github.com/phcurado/zoi/releases/tag/v0.7.1" rel="noopener nofollow ugc">zoi</a> | <a href="https://hex.pm/packages/zoi/0.7.1" rel="nofollow">Hex</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="375514" data-batch-url="/posts/batch_likers">
                        5
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/zoi-schema-validation-library-inspired-by-zod/72108/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-375514" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="375514"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #13"></div>
  </section>
</div>
    <div class="postbit" id="376748" data-post-id="376748">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="lucas-stellet" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/lucas-stellet/120/24821_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  lucas-stellet
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hi, <a class="mention" href="/u/phcurado" rel="nofollow">@phcurado</a>!<br>
Is there any feature like unset that removes the field from the parsed data if the key is nil?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376748" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/zoi-schema-validation-library-inspired-by-zod/72108/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-376748" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376748"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #14"></div>
  </section>
</div>
    <div class="postbit" id="376751" data-post-id="376751">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="phcurado" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/phcurado/120/39030_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  phcurado
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>hey, an easy way to achieve this is with the <a href="https://hexdocs.pm/zoi/Zoi.html#transform/2" rel="noopener nofollow ugc">transform API</a>.<br>
For example, having a schema definition like this:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyApp.User do
  def schema() do
    Zoi.object(%{
      name: Zoi.nullable(Zoi.string()),
      age: Zoi.integer()
    })
    |&gt; Zoi.transform(&amp;unset_nil_fields/1)
  end

  def unset_nil_fields(map) do
    map
    |&gt; Enum.filter(fn {_k, v} -&gt; v != nil end)
    |&gt; Enum.into(%{})
  end
end
</code></pre>
<p>It will allow <code>nil</code> fields to be removed from the parsed data:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">iex&gt; Zoi.parse(MyApp.User.schema(), %{name: nil, age: 30})
{:ok, %{age: 30}}
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="376751" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/zoi-schema-validation-library-inspired-by-zod/72108/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-376751" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="376751"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #15"></div>
  </section>
</div>
    <div class="postbit" id="377030" data-post-id="377030">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="phcurado" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/phcurado/120/39030_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  phcurado
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h1><a name="p-377030-v082-released-rocket-1" class="anchor" href="#p-377030-v082-released-rocket-1" aria-label="Heading link" rel="nofollow"></a>v0.8.2 released <img src="https://forum.elixirforum.com/images/emoji/apple/rocket.png?v=15" title=":rocket:" class="emoji" alt=":rocket:" loading="lazy" width="20" height="20"></h1>
<p>Hey everyone, this release brings schema documentation introspection for <code>Zoi.object/2</code> and <code>Zoi.keyword/2</code> types.</p>
<h2><a name="p-377030-example-2" class="anchor" href="#p-377030-example-2" aria-label="Heading link" rel="nofollow"></a>Example</h2>
<p>One common example is when passing maps or keyword lists as parameters in your function, it’s often hard to keep track of what keys are expected and their types.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">
@spec create_user(map(), keyword()) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()}
def create_user(params, opts \\ []) do
    ## creating user
end
</code></pre>
<p>and overtime you may lose track of what <code>params</code> or <code>opts</code> are being passed. <code>Zoi</code> can help you to give more meaning to these arguments:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">@create_user_params Zoi.object(%{
  name: Zoi.string(description: "The user first name"),
  age: Zoi.integer(description: "The user age") |&gt; Zoi.min(0) |&gt; Zoi.optional(),
  email: Zoi.email(description: "The user email")
})

@create_user_opts Zoi.keyword([
  skip_checks: Zoi.boolean(description: "Wether to skip validation checks")
])

@doc """
Creates a new user.

Params:
#{Zoi.describe(@create_user_params)}

Options:
#{Zoi.describe(@create_user_opts)}
"""
@spec create_user(
      unquote(Zoi.type_spec(@create_user_params)),
      unquote(Zoi.type_spec(@create_user_opts))
    ) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()}
def create_user(params, opts \\ []) do
    # parsing params and opts to ensure they conform to the schema
    params = Zoi.parse!(@create_user_params, params)
    opts = Zoi.parse!(@create_user_opts, opts)
    ## creating user
end
</code></pre>
<p>For library authors, this is a great way to document the expected input schemas for functions, the example above would generate the following documentation:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">Creates a new user.

Params:
* `:name` (`t:String.t/0`) - Required. The user first name
* `:age` (`t:integer/0`) - The user
* `:email` (`t:String.t/0`) - Required. The user email

Opts:
* `:skip_checks` (`t:boolean/0`) - Wether to skip validation checks
</code></pre>
<p>The doc output was inspired by <a href="https://hexdocs.pm/nimble_options/NimbleOptions.html" rel="noopener nofollow ugc">nimble_options</a>, which offers a format compatible with <a href="https://hexdocs.pm/" rel="noopener nofollow ugc">HexDocs</a>, and users will be able to check each argument and their types directly on the function documentation published in hexdocs.</p>
<p>More details in the <a href="https://hexdocs.pm/zoi/Zoi.Describe.html" rel="noopener nofollow ugc">oficial docs</a>.</p>
<p>Release v0.8.2: <a href="https://github.com/phcurado/zoi/releases/tag/v0.8.2" rel="noopener nofollow ugc">zoi</a> | <a href="https://hex.pm/packages/zoi/0.8.2" rel="nofollow">Hex</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="377030" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/zoi-schema-validation-library-inspired-by-zod/72108/17">Post #16</a>
	                </div>
	            </div>
              <div id="likers-container-377030" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="377030"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #16"></div>
  </section>
</div>
    <div class="postbit" id="377683" data-post-id="377683">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="phcurado" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/phcurado/120/39030_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  phcurado
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h1><a name="p-377683-v010-released-with-phoenix-form-support-rocket-1" class="anchor" href="#p-377683-v010-released-with-phoenix-form-support-rocket-1" aria-label="Heading link" rel="nofollow"></a>v0.10 released with Phoenix form support <img src="https://forum.elixirforum.com/images/emoji/apple/rocket.png?v=15" title=":rocket:" class="emoji" alt=":rocket:" loading="lazy" width="20" height="20"></h1>
<p>Hi everyone! I finally released the <strong>0.10</strong> version of <code>Zoi</code>, now you can use your <code>Zoi</code> schemas directly in Phoenix forms.<br>
This release implements the <code>Phoenix.HTML.FormData</code> protocol, which allows you to use <code>Zoi.Context</code> structs as form data sources.</p>
<p>Quick example:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir"># Define schema inline
@user_schema Zoi.object(%{
  name: Zoi.string() |&gt; Zoi.min(3),
  email: Zoi.email()
}) |&gt; Zoi.Form.prepare()

# Parse and render (just like changesets!)
ctx = Zoi.Form.parse(@user_schema, params)
form = to_form(ctx, as: :user)

socket |&gt; assign(:form, form)

# Use in your forms
~H"""
&lt;.form for={@form} phx-submit="save"&gt;
  &lt;.input field={@form[:name]} label="Name" /&gt;
  &lt;.input field={@form[:email]} label="Email" /&gt;
  &lt;div&gt;
    &lt;.button&gt;Save&lt;/.button&gt;
  &lt;/div&gt;
&lt;/.form&gt;
"""
</code></pre>
<h2><a name="p-377683-guides-2" class="anchor" href="#p-377683-guides-2" aria-label="Heading link" rel="nofollow"></a>Guides</h2>
<ul>
<li><a href="https://hexdocs.pm/zoi/rendering_forms_with_phoenix.html" rel="noopener nofollow ugc">Phoenix Forms Integration Guide</a> - Detailed guide on integrating with phoenix</li>
<li><a href="https://hexdocs.pm/zoi/localizing_errors_with_gettext.html" rel="noopener nofollow ugc">Localizing Errors with Gettext Guide</a> - For more information on how to localize error messages.</li>
</ul>
<p>Release v0.10: <a href="https://github.com/phcurado/zoi/releases/tag/v0.10.0" rel="noopener nofollow ugc">zoi</a> | <a href="https://hex.pm/packages/zoi/0.10.0" rel="nofollow">Hex</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="377683" data-batch-url="/posts/batch_likers">
                        9
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/zoi-schema-validation-library-inspired-by-zod/72108/18">Post #17</a>
	                </div>
	            </div>
              <div id="likers-container-377683" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="377683"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #17"></div>
  </section>
</div>
    <div class="postbit" id="377711" data-post-id="377711">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jam" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jam/120/36266_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jam
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks for making this. Looks good. A few questions:</p>
<ol>
<li>Do you have any plans for Ecto support? I think it’d be nice to create one schema and then derive any others needed from it, e.g. boundary checks etc.</li>
<li>Do you plan to support deep partials?</li>
<li>Wouldn’t it be more Elixir native to only have <code>map</code> and <code>list</code> in place of <code>object</code> and <code>array</code> respectively? I see you have <code>list</code> as an alias for <code>array</code>. IMO, seeing <code>object</code> and <code>array</code> feels a bit off and maybe they should be deprecated.</li>
<li>Is there a way to globally alias <code>Zoi</code> as <code>Z</code>?</li>
</ol> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="377711" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/zoi-schema-validation-library-inspired-by-zod/72108/19">Post #18</a>
	                </div>
	            </div>
              <div id="likers-container-377711" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="377711"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #18"></div>
  </section>
</div>
    <div class="postbit" id="377719" data-post-id="377719">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="phcurado" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/phcurado/120/39030_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  phcurado
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hi <a class="mention" href="/u/jam" rel="nofollow">@jam</a></p>
<ol>
<li>No plans for now, to be 100% compatible with ecto would be a huge effort, ecto is a different beast. Ecto also offers more specialized functions for your database operations, this would not be something I would add on Zoi. I assume you mean integrating Zoi schemas with Ecto schemas (not changesets), to have a unified definition across both, that is interesting, but not a current goal.</li>
<li>I plan to add some helpers so you can customise nested schemas, the new Form does this already but I need to generalize the functions. Basically a function that can traverse the nested structure and apply a change to its types.</li>
<li>In Zoi, the map type represents any key/value structure (like in Elixir), annd object defines a structured schema with specific keys. I dont think object should be deprecated, though I agree the naming feels less native to Elixir.</li>
<li>No, you can only alias like that inside a module (alias Zoi, as: Z)</li>
</ol> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="377719" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/zoi-schema-validation-library-inspired-by-zod/72108/20">Post #19</a>
	                </div>
	            </div>
              <div id="likers-container-377719" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="377719"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #19"></div>
  </section>
</div>
    <div class="postbit" id="378337" data-post-id="378337">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="kasvith" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/kasvith/120/21600_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  kasvith
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>This is a game changer for Elixir, finally we have a better way to define composable validations with a nice syntax.</p>
<p>Great work <a class="mention" href="/u/phcurado" rel="nofollow">@phcurado</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="378337" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/zoi-schema-validation-library-inspired-by-zod/72108/21">Post #20</a>
	                </div>
	            </div>
              <div id="likers-container-378337" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="378337"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #20"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/72108/load_more?page=3">Load more posts (35 remaining)</a>
</div></template></turbo-stream>