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/1Custom 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
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")
trueUsage in DSL:
param :password, :string, "Password",
validator: ConduitMcp.Validation.Validators.all([
&ConduitMcp.Validation.Validators.non_empty_string/1,
ConduitMcp.Validation.Validators.range(8, 128)
])
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
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")
trueUsage in DSL:
param :id, :string, "ID",
validator: ConduitMcp.Validation.Validators.any([
&ConduitMcp.Validation.Validators.uuid/1,
ConduitMcp.Validation.Validators.regex(~r/^[A-Z]{2}+$/)
])
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
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
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"])
falseUsage in DSL:
param :emails, {:array, :string}, "Email list",
validator: ConduitMcp.Validation.Validators.list_of(&ConduitMcp.Validation.Validators.email/1)
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
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
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")
falseNote: 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))
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
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)
falseUsage in DSL:
param :score, :integer, "Score", validator: ConduitMcp.Validation.Validators.range(0, 100)
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")
falseUsage in DSL:
param :phone, :string, "Phone", validator: ConduitMcp.Validation.Validators.regex(~r/^{3}-{3}-{4}$/)
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
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