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


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="zoedsoupe" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/zoedsoupe/120/25602_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  zoedsoupe
                    <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>Yeah,  I need to revisit the docs! I’ll update it. Thanks for noting that!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="331972" 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/peri-a-comprehensive-schema-validation-library-for-elixir/64247/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-331972" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="331972"
                     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="332061" data-post-id="332061">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Removed. I realized I don’t actually have a strong opinion.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="332061" 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/peri-a-comprehensive-schema-validation-library-for-elixir/64247/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-332061" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="332061"
                     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="332321" data-post-id="332321">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="zoedsoupe" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/zoedsoupe/120/25602_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  zoedsoupe
                    <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>announcing new features and performance improvements in Peri, our schema validation library! Here’s a quick overview:</p>
<h4><a name="p-332321-new-features-1" class="anchor" href="#p-332321-new-features-1" aria-label="Heading link" rel="nofollow"></a>New Features:</h4>
<p><strong>1. Transform Type</strong></p>
<ul>
<li>Apply a transformation function to your data post-validation.</li>
<li>Example:<pre data-code-wrap="elixir"><code class="lang-elixir">defschema :user, %{
  name: :string,
  age: {:integer, {:transform, &amp;(&amp;1 * 2)}}
}
</code></pre>
</li>
</ul>
<p><strong>2. Default Values</strong></p>
<ul>
<li>Set default values for fields when they are missing.</li>
<li>Example:<pre data-code-wrap="elixir"><code class="lang-elixir">defschema :user, %{
  name: {:string, {:default, "Anonymous"}}
}
</code></pre>
</li>
</ul>
<p><strong>3. Dependent Types</strong></p>
<ul>
<li>Validate fields based on the value of other fields.</li>
<li>Example:<pre data-code-wrap="elixir"><code class="lang-elixir">defschema :user, %{
  age: :integer,
  license: {:dependent, :age, fn age -&gt; age &gt;= 18 end, :string}
}
</code></pre>
</li>
</ul>
<h4><a name="p-332321-performance-improvements-2" class="anchor" href="#p-332321-performance-improvements-2" aria-label="Heading link" rel="nofollow"></a>Performance Improvements:</h4>
<ul>
<li>Enhanced <code>Peri.Parser</code> for faster schema traversal and error handling.</li>
</ul>
<p>Check out the latest version on <a href="https://github.com/yourrepo/peri" rel="noopener nofollow ugc">GitHub</a> and let us know your thoughts!</p>
<p>Happy coding!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="332321" 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/peri-a-comprehensive-schema-validation-library-for-elixir/64247/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-332321" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="332321"
                     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="360929" data-post-id="360929">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hey, nice library. Works well so far. I’m finding myself writing both 1) Peri schema 2) defstruct. Feels like I’m duplicating work. Any suggestions?</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule SightxrApi.Job.WorkflowSchemas do
  import Peri

  defschema(:parse_documents, %{
    "files" =&gt; {:required, {:list, get_schema(:file)}},
    "out_dirs" =&gt; {:list, :string},
    "parser" =&gt; {:enum, ["tika", "azure_document_intelligence"]}
  })

  # ... omitted for brevity
end
</code></pre>
<p>And the defstruct:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule SightxrApi.Job.ParseDocumentsWorkflow do
  defmodule Options do
    defstruct [:files, :parser, :out_dirs]

    def new(args) do
      %__MODULE__{
        files: args["files"],
        parser: args["parser"],
        out_dirs: args["out_dirs"]
      }
    end
  end

  # ... omitted for brevity
end
</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="360929" 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/peri-a-comprehensive-schema-validation-library-for-elixir/64247/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-360929" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="360929"
                     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="362203" data-post-id="362203">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>not sure if this helps, but in my structs, to reduce duplication, I am using the <a href="https://github.com/zoedsoupe/peri?tab=readme-ov-file#without-the-macro" rel="noopener nofollow ugc">non-macro API</a>:</p>
<pre data-code-wrap="ex"><code class="lang-ex">  @schema %{
    value: {:required, {:float, {:gt, 0}}},
    unit: {:required, {:enum, [:meters]}}
  }

  @keys Map.keys(@schema)
  defstruct @keys

  def new(params) do
    with {:ok, data}  &lt;- Peri.validate(@schema, params) do
      {:ok, struct(__MODULE__, data)}
    end
  end

```</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="362203" 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/peri-a-comprehensive-schema-validation-library-for-elixir/64247/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-362203" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="362203"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>