Skip to main content

Crate sashite_sin

Crate sashite_sin 

Source
Expand description

§Style Identifier Notation (SIN)

A no_std, unsafe-free implementation of the SIN v1.0.0 specification.

SIN is a compact, ASCII-only token that encodes a player’s identity — the pair (player side, player style) — at the level of notation. A token has the shape:

<abbr>

matching the anchored regular expression ^[A-Za-z]$, and maps to exactly two attributes:

ComponentEncodesValues
letter caseSideuppercase → First, lowercase → Second
letterLetterthe player-style abbreviation (AZ)

SIN standardizes only the encoding; which letter denotes which style is left to the rule system. See the glossary.

§Validity

The anchors bind the whole string, not a line within it: a token is one ASCII letter and nothing else. Nothing is trimmed, no surrounding whitespace is tolerated, and a trailing \r or \n is never absorbed — so "W" parses while " W", "W " and "W\n" do not. Validation is strict and never normalizes: parsing a token and encoding it again reproduces the original text byte for byte.

That makes the domain closed and small — 26 letters × 2 sides = 52 tokens, and nothing else is valid at any length.

§Example

use sashite_sin::{Identifier, Side};

let western: Identifier = "W".parse()?;
assert_eq!(western.letter().as_char(), 'W');
assert_eq!(western.side(), Side::First);

// A SIN token is exactly one character.
assert_eq!(western.to_char(), 'W');
assert_eq!(western.encode().as_str(), "W");

// Cheap, infallible transformations (the type is `Copy`).
assert_eq!(western.flipped().to_char(), 'w');

§Guarantees

  • no_std and allocation-free: parsing borrows the input bytes and an Identifier is a 2-byte Copy value; nothing is heap-allocated.
  • No unsafe: the crate is built under a forbid-unsafe lint policy.
  • Bounded, panic-free parsing: inputs longer than one byte are rejected before inspection, and the public parsing API never panics — including TryFrom<&[u8]>, which accepts arbitrary bytes and needs no UTF-8 check to reject them safely.
  • One notion of validity: every entry point (Identifier::parse, Identifier::is_valid, core::str::FromStr and both TryFrom impls) returns the same answer, down to the ParseError variant.
  • No required dependencies: SIN is self-contained, so the default build has an empty dependency graph; the optional serde feature adds serde (kept no_std).

Structs§

EncodedSin
The canonical string form of an Identifier, stored inline.
Identifier
A parsed SIN token: a player’s identity at the level of notation.
Letter
The single-letter abbreviation of a player style.

Enums§

ParseError
The reason a string could not be parsed as a SIN token.
Side
The camp a player belongs to.