sift/string

String validators — length, pattern matching, format checks (email, url, uuid).

Values

pub fn alpha(msg: String) -> fn(String) -> Result(String, String)

All characters must be letters (a-zA-Z).

let validator = string.alpha("letters only")
validator("abc")   // -> Ok("abc")
validator("abc1")  // -> Error("letters only")
pub fn alphanumeric(
  msg: String,
) -> fn(String) -> Result(String, String)

All characters must be letters or digits.

let validator = string.alphanumeric("alphanumeric only")
validator("abc123")  // -> Ok("abc123")
validator("abc 123") // -> Error("alphanumeric only")
pub fn contains(
  substring: String,
  msg: String,
) -> fn(String) -> Result(String, String)

String must contain the given substring

pub fn email(msg: String) -> fn(String) -> Result(String, String)

Must look like an email (contains exactly one @, something before and after).

let validator = string.email("invalid email")
validator("jo@example.com")  // -> Ok("jo@example.com")
validator("nope")            // -> Error("invalid email")
pub fn ends_with(
  suffix: String,
  msg: String,
) -> fn(String) -> Result(String, String)

String must end with the given suffix

pub fn length(
  n: Int,
  msg: String,
) -> fn(String) -> Result(String, String)

String must have exactly n graphemes

pub fn matches(
  pattern: String,
  msg: String,
) -> fn(String) -> Result(String, String)

String must match the given regex pattern.

let validator = string.matches("^[A-Z]{3}$", "must be 3 uppercase letters")
validator("ABC")   // -> Ok("ABC")
validator("abc")   // -> Error("must be 3 uppercase letters")
pub fn max_length(
  n: Int,
  msg: String,
) -> fn(String) -> Result(String, String)

String must have at most n graphemes

pub fn min_length(
  n: Int,
  msg: String,
) -> fn(String) -> Result(String, String)

String must have at least n graphemes

pub fn non_empty(
  msg: String,
) -> fn(String) -> Result(String, String)

String must not be empty (shorthand for min_length(1))

pub fn numeric(
  msg: String,
) -> fn(String) -> Result(String, String)

All characters must be digits (0-9).

let validator = string.numeric("digits only")
validator("123")   // -> Ok("123")
validator("12a")   // -> Error("digits only")
pub fn one_of(
  values: List(String),
  msg: String,
) -> fn(String) -> Result(String, String)

String must be one of the given values.

let validator = string.one_of(["admin", "user", "guest"], "invalid role")
validator("admin")   // -> Ok("admin")
validator("root")    // -> Error("invalid role")
pub fn starts_with(
  prefix: String,
  msg: String,
) -> fn(String) -> Result(String, String)

String must start with the given prefix

pub fn trimmed(
  msg: String,
) -> fn(String) -> Result(String, String)

String must have no leading or trailing whitespace.

let validator = string.trimmed("no surrounding spaces")
validator("hello")   // -> Ok("hello")
validator(" hello")  // -> Error("no surrounding spaces")
pub fn url(msg: String) -> fn(String) -> Result(String, String)

Must look like a URL (http:// or https://).

let validator = string.url("invalid url")
validator("https://example.com")  // -> Ok("https://example.com")
validator("example.com")          // -> Error("invalid url")
pub fn uuid(msg: String) -> fn(String) -> Result(String, String)

Must be a valid UUID v4 format.

let validator = string.uuid("invalid uuid")
validator("550e8400-e29b-41d4-a716-446655440000")  // -> Ok(..)
validator("not-a-uuid")                            // -> Error("invalid uuid")
Search Document