snn.ex

Hex.pmDocsLicense

SNN (Style Name Notation) implementation for Elixir.

Overview

This library implements the SNN Specification v1.0.0.

Implementation Constraints

Constraint Value Rationale
Max string length 32 Sufficient for realistic style names

These constraints enable bounded memory usage and safe parsing.

Installation

Add sashite_snn to your list of dependencies in mix.exs:

def deps do
  [
    {:sashite_snn, "~> 2.0"}
  ]
end

Usage

Parsing (String → StyleName)

Convert an SNN string into a StyleName struct.

alias Sashite.Snn.StyleName

# Standard parsing (returns {:ok, _} or {:error, _})
{:ok, snn} = Sashite.Snn.parse("Chess")
snn.name  # => "Chess"

# With numeric suffix
{:ok, snn} = Sashite.Snn.parse("Chess960")
snn.name  # => "Chess960"

# Bang version (raises on error)
snn = Sashite.Snn.parse!("Shogi")

# Invalid input returns error tuple
{:error, :empty_input} = Sashite.Snn.parse("")
{:error, :invalid_format} = Sashite.Snn.parse("chess")

Formatting (StyleName → String)

Convert a StyleName back to an SNN string.

alias Sashite.Snn.StyleName

# From StyleName struct
snn = StyleName.new("Chess")
StyleName.to_string(snn)  # => "Chess"

# String interpolation (via String.Chars protocol)
"Playing #{snn}"  # => "Playing Chess"

Validation

# Boolean check
Sashite.Snn.valid?("Chess")     # => true
Sashite.Snn.valid?("Chess960")  # => true
Sashite.Snn.valid?("chess")     # => false (lowercase start)
Sashite.Snn.valid?("")          # => false (empty)

Accessing Data

snn = Sashite.Snn.parse!("Chess960")

# Get the name (struct field)
snn.name  # => "Chess960"

API Reference

Types

# StyleName represents a validated SNN style name.
%Sashite.Snn.StyleName{
  name: String.t()  # The validated SNN string
}

# Create a StyleName from a valid name string.
# Raises ArgumentError if the name is invalid.
Sashite.Snn.StyleName.new(name)

Constants

Sashite.Snn.Constants.max_string_length()  # => 32

Parsing

# Parses an SNN string into a StyleName.
# Returns {:ok, style_name} or {:error, reason}.
@spec Sashite.Snn.parse(String.t()) :: {:ok, StyleName.t()} | {:error, atom()}

# Parses an SNN string into a StyleName.
# Raises ArgumentError if the string is not valid.
@spec Sashite.Snn.parse!(String.t()) :: StyleName.t()

Validation

# Reports whether string is a valid SNN style name.
@spec Sashite.Snn.valid?(String.t()) :: boolean()

Errors

Parsing errors are returned as atoms:

Atom Cause
:empty_input String length is 0
:input_too_long String exceeds 32 characters
:invalid_format Does not match SNN format

Design Principles

Related Specifications

License

Available as open source under the Apache License 2.0.