# `ConduitMcp.Validation.Validators`
[🔗](https://github.com/nyo16/conduit_mcp/blob/v0.10.1/lib/conduit_mcp/validation/validators.ex#L1)

Common validation functions for use with the ConduitMCP DSL.

This module provides pre-built validator functions that can be used
with the `validator:` option in DSL parameter definitions. All
validator functions return `true` for valid values, `false` for
invalid values, or can return `{:error, message}` for custom
error messages.

## Usage Examples

    # Using built-in email validator
    param :email, :string, "Email address", validator: &ConduitMcp.Validation.Validators.email/1

    # Using URL validator
    param :website, :string, "Website URL", validator: &ConduitMcp.Validation.Validators.url/1

    # Using positive number validator
    param :count, :integer, "Item count", validator: &ConduitMcp.Validation.Validators.positive_number/1

## Custom Validators

You can also create custom validators that follow the same pattern:

    defmodule MyApp.Validators do
      def custom_id(value) when is_binary(value) do
        String.match?(value, ~r/^[A-Z]{2}{6}$/)
      end

      def custom_id(_), do: false
    end

    # Usage in DSL
    param :id, :string, "Custom ID", validator: &MyApp.Validators.custom_id/1

# `all`

Creates a composite validator that requires all provided validators to pass.

Returns a validator function that checks if all validators return true.

## Examples

    iex> strong_password = ConduitMcp.Validation.Validators.all([
    ...>   &ConduitMcp.Validation.Validators.non_empty_string/1,
    ...>   ConduitMcp.Validation.Validators.range(8, 50)
    ...> ])
    iex> strong_password.("password123")
    true

Usage in DSL:

    param :password, :string, "Password",
      validator: ConduitMcp.Validation.Validators.all([
        &ConduitMcp.Validation.Validators.non_empty_string/1,
        ConduitMcp.Validation.Validators.range(8, 128)
      ])

# `alphanumeric`

Validates that a string contains only alphanumeric characters.

## Examples

    iex> ConduitMcp.Validation.Validators.alphanumeric("abc123")
    true

    iex> ConduitMcp.Validation.Validators.alphanumeric("abc-123")
    false

    iex> ConduitMcp.Validation.Validators.alphanumeric("hello world")
    false

# `any`

Creates a composite validator that requires at least one provided validator to pass.

Returns a validator function that checks if any validator returns true.

## Examples

    iex> flexible_id = ConduitMcp.Validation.Validators.any([
    ...>   &ConduitMcp.Validation.Validators.uuid/1,
    ...>   &ConduitMcp.Validation.Validators.positive_number/1
    ...> ])
    iex> flexible_id.(123)
    true

    iex> flexible_id = ConduitMcp.Validation.Validators.any([
    ...>   &ConduitMcp.Validation.Validators.uuid/1,
    ...>   &ConduitMcp.Validation.Validators.positive_number/1
    ...> ])
    iex> flexible_id.("550e8400-e29b-41d4-a716-446655440000")
    true

Usage in DSL:

    param :id, :string, "ID",
      validator: ConduitMcp.Validation.Validators.any([
        &ConduitMcp.Validation.Validators.uuid/1,
        ConduitMcp.Validation.Validators.regex(~r/^[A-Z]{2}+$/)
      ])

# `email`

Validates email addresses using a basic regex pattern.

## Examples

    iex> ConduitMcp.Validation.Validators.email("user@example.com")
    true

    iex> ConduitMcp.Validation.Validators.email("invalid-email")
    false

    iex> ConduitMcp.Validation.Validators.email(123)
    false

# `iso_date`

Validates ISO 8601 date strings.

Supports basic YYYY-MM-DD format.

## Examples

    iex> ConduitMcp.Validation.Validators.iso_date("2024-01-15")
    true

    iex> ConduitMcp.Validation.Validators.iso_date("2024-13-01")
    false

    iex> ConduitMcp.Validation.Validators.iso_date("not-a-date")
    false

# `list_of`

Validates that all items in a list pass a given validator.

Returns a validator function that checks each item in a list
against the provided validator function.

## Examples

    iex> email_list_validator = ConduitMcp.Validation.Validators.list_of(&ConduitMcp.Validation.Validators.email/1)
    iex> email_list_validator.(["user1@example.com", "user2@example.com"])
    true

    iex> email_list_validator = ConduitMcp.Validation.Validators.list_of(&ConduitMcp.Validation.Validators.email/1)
    iex> email_list_validator.(["valid@example.com", "invalid-email"])
    false

Usage in DSL:

    param :emails, {:array, :string}, "Email list",
      validator: ConduitMcp.Validation.Validators.list_of(&ConduitMcp.Validation.Validators.email/1)

# `non_empty_string`

Validates that a string is non-empty (contains at least one character).

## Examples

    iex> ConduitMcp.Validation.Validators.non_empty_string("hello")
    true

    iex> ConduitMcp.Validation.Validators.non_empty_string("   ")
    false

    iex> ConduitMcp.Validation.Validators.non_empty_string("")
    false

# `non_negative_number`

Validates that a number is non-negative (greater than or equal to 0).

## Examples

    iex> ConduitMcp.Validation.Validators.non_negative_number(0)
    true

    iex> ConduitMcp.Validation.Validators.non_negative_number(5)
    true

    iex> ConduitMcp.Validation.Validators.non_negative_number(-1)
    false

# `one_of`

Validates that a value is one of the specified allowed values.

Returns a validator function that checks if the value is in
the provided list of allowed values.

## Examples

    iex> priority_validator = ConduitMcp.Validation.Validators.one_of(["low", "medium", "high"])
    iex> priority_validator.("medium")
    true

    iex> priority_validator = ConduitMcp.Validation.Validators.one_of(["low", "medium", "high"])
    iex> priority_validator.("urgent")
    false

Note: This is similar to the `enum:` option in DSL, but can be used
when you need more complex validation logic.

Usage in DSL:

    param :priority, :string, "Priority",
      validator: ConduitMcp.Validation.Validators.one_of(~w(low medium high critical))

# `positive_number`

Validates that a number is positive (greater than 0).

## Examples

    iex> ConduitMcp.Validation.Validators.positive_number(5)
    true

    iex> ConduitMcp.Validation.Validators.positive_number(5.5)
    true

    iex> ConduitMcp.Validation.Validators.positive_number(0)
    false

    iex> ConduitMcp.Validation.Validators.positive_number(-1)
    false

# `range`

Validates that a value is within a specific range (inclusive).

Returns a validator function that checks if the value is between
min and max (inclusive).

## Examples

    iex> validator = ConduitMcp.Validation.Validators.range(1, 10)
    iex> validator.(5)
    true

    iex> validator = ConduitMcp.Validation.Validators.range(1, 10)
    iex> validator.(15)
    false

Usage in DSL:

    param :score, :integer, "Score", validator: ConduitMcp.Validation.Validators.range(0, 100)

# `regex`

Validates that a string matches a specific regex pattern.

Returns a validator function that checks if the string matches
the provided regex.

## Examples

    iex> phone_validator = ConduitMcp.Validation.Validators.regex(~r/^{3}-{3}-{4}$/)
    iex> phone_validator.("123-456-7890")
    true

    iex> phone_validator = ConduitMcp.Validation.Validators.regex(~r/^{3}-{3}-{4}$/)
    iex> phone_validator.("invalid-phone")
    false

Usage in DSL:

    param :phone, :string, "Phone", validator: ConduitMcp.Validation.Validators.regex(~r/^{3}-{3}-{4}$/)

# `url`

Validates HTTP and HTTPS URLs.

## Examples

    iex> ConduitMcp.Validation.Validators.url("https://example.com")
    true

    iex> ConduitMcp.Validation.Validators.url("http://localhost:3000")
    true

    iex> ConduitMcp.Validation.Validators.url("not-a-url")
    false

    iex> ConduitMcp.Validation.Validators.url("ftp://example.com")
    false

# `uuid`

Validates UUID strings in various formats.

Supports both hyphenated (8-4-4-4-12) and non-hyphenated formats.

## Examples

    iex> ConduitMcp.Validation.Validators.uuid("550e8400-e29b-41d4-a716-446655440000")
    true

    iex> ConduitMcp.Validation.Validators.uuid("550e8400e29b41d4a716446655440000")
    true

    iex> ConduitMcp.Validation.Validators.uuid("invalid-uuid")
    false

---

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