Skip to main content

Letter

Struct Letter 

Source
pub struct Letter(/* private fields */);
Expand description

The single-letter abbreviation of a player style.

A Letter is the identity part of a SIN token, independent of side. Per the specification the abbreviation is case-insensitive (C and c denote the same style), so a Letter is always stored uppercase; the case of the original token is carried separately by Side.

§Invariant

The wrapped byte is always an uppercase ASCII letter (b'A'..=b'Z'). The field is private and every constructor enforces the range, so the invariant cannot be violated from outside the crate.

It is what makes the crate’s arithmetic total. Three places shift a byte by 32 to change case, and each would panic on overflow in a debug build; the invariant keeps every one of them inside 65..=122, far from either end of a u8. Nothing in the type system enforces that, so the tests sweep every public constructor to prove it.

Ordering is alphabetical (A < B < … < Z).

Implementations§

Source§

impl Letter

Source

pub const ALL: [Self; 26]

Every abbreviation, in alphabetical order (A through Z).

Source

pub const fn from_ascii(byte: u8) -> Option<(Self, Side)>

Decodes a raw ASCII byte into a Letter and the Side its case implies.

Returns None for any byte that is not an ASCII letter. This is the lossless decoder used by the token parser: the byte it was given can always be rebuilt from the pair it returns.

Note this takes a byte. Reaching for it with c as u8 on a char silently truncates to the low eight bits and can turn a non-ASCII character into a letter that was never there — 'Ł' (U+0141) becomes 0x41, the byte b'A'. Use Letter::try_from_char for a char; it matches on the character before casting and so cannot be fooled.

§Examples
use sashite_sin::{Letter, Side};

let (letter, side) = Letter::from_ascii(b'c').unwrap();
assert_eq!(letter.as_char(), 'C');
assert_eq!(side, Side::Second);

assert!(Letter::from_ascii(b'1').is_none());

// The `char` door is the safe one for non-ASCII input.
assert!(Letter::try_from_char('\u{0141}').is_err());
Source

pub const fn try_from_char(c: char) -> Result<Self, ParseError>

Builds a Letter from a char, folding case.

Both 'C' and 'c' yield the same Letter; the case (which encodes side) is not retained.

Case folding here is ASCII-only and deliberately so: the range patterns compare Unicode scalar values, so characters that case-fold to an ASCII letter — 'ſ' (U+017F), 'K' (U+212A) — are still rejected. Only the 52 characters the grammar names are abbreviations.

§Errors

Returns ParseError::InvalidLetter if c is not an ASCII letter. This is the only variant this function can produce: a char has no length to be wrong about.

§Examples
use sashite_sin::Letter;

assert_eq!(Letter::try_from_char('j').unwrap().as_char(), 'J');
assert!(Letter::try_from_char('+').is_err());
assert!(Letter::try_from_char('\u{017F}').is_err()); // folds to 's'
Source

pub const fn as_char(self) -> char

Returns the abbreviation as an uppercase char.

Source

pub const fn as_ascii(self) -> u8

Returns the abbreviation as its raw uppercase ASCII byte.

Trait Implementations§

Source§

impl Clone for Letter

Source§

fn clone(&self) -> Letter

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Letter

Source§

impl Debug for Letter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for Letter

Source§

impl Hash for Letter

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for Letter

Source§

fn cmp(&self, other: &Letter) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 (const: unstable) · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable) · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 (const: unstable) · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Letter

Source§

fn eq(&self, other: &Letter) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl PartialOrd for Letter

Source§

fn partial_cmp(&self, other: &Letter) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 (const: unstable) · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 (const: unstable) · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 (const: unstable) · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 (const: unstable) · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl StructuralPartialEq for Letter

Source§

impl TryFrom<char> for Letter

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(c: char) -> Result<Self, Self::Error>

Performs the conversion.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.