ConduitMcp.Validation.Validators (ConduitMCP v0.9.4)

Copy Markdown View Source

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

Summary

Functions

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

Validates that a string contains only alphanumeric characters.

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

Validates email addresses using a basic regex pattern.

Validates ISO 8601 date strings.

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

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

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

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

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

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

Validates that a string matches a specific regex pattern.

Validates HTTP and HTTPS URLs.

Validates UUID strings in various formats.

Functions

all(validators)

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(value)

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(validators)

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(value)

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(value)

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(item_validator)

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(value)

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(value)

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(allowed_values)

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(value)

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(min, max)

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(pattern)

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(value)

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(value)

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