Sashite.Snn.Parser (Sashite.Snn v2.0.0)

View Source

Secure parser for SNN (Style Name Notation) strings.

Designed for untrusted input: validates bounds first, parses character by character, and enforces strict constraints at every step.

SNN Format

An SNN token is a PascalCase name with optional numeric suffix:

  • Starts with exactly one uppercase letter (A-Z)
  • Followed by zero or more letters (A-Z, a-z)
  • Ends with zero or more digits (0-9)

Examples

iex> Sashite.Snn.Parser.parse("Chess")
{:ok, "Chess"}

iex> Sashite.Snn.Parser.parse("Chess960")
{:ok, "Chess960"}

iex> Sashite.Snn.Parser.parse("chess")
{:error, :invalid_format}

See: https://sashite.dev/specs/snn/1.0.0/

Summary

Functions

Parses an SNN string, validating its format.

Reports whether the input is a valid SNN string.

Functions

parse(input)

@spec parse(String.t()) :: {:ok, String.t()} | {:error, atom()}

Parses an SNN string, validating its format.

Performs validation in order of computational cost:

  1. Type and length check (O(1) - immediate rejection of oversized input)
  2. First character check (O(1))
  3. Character-by-character parsing with state transitions

Examples

iex> Sashite.Snn.Parser.parse("Chess")
{:ok, "Chess"}

iex> Sashite.Snn.Parser.parse("Shogi")
{:ok, "Shogi"}

iex> Sashite.Snn.Parser.parse("Chess960")
{:ok, "Chess960"}

iex> Sashite.Snn.Parser.parse("A")
{:ok, "A"}

iex> Sashite.Snn.Parser.parse("")
{:error, :empty_input}

iex> Sashite.Snn.Parser.parse("chess")
{:error, :invalid_format}

iex> Sashite.Snn.Parser.parse("123")
{:error, :invalid_format}

valid?(input)

@spec valid?(term()) :: boolean()

Reports whether the input is a valid SNN string.

Examples

iex> Sashite.Snn.Parser.valid?("Chess")
true

iex> Sashite.Snn.Parser.valid?("Chess960")
true

iex> Sashite.Snn.Parser.valid?("chess")
false

iex> Sashite.Snn.Parser.valid?("")
false

iex> Sashite.Snn.Parser.valid?(nil)
false