type-protocol 0.1.0

A crate provding a simple syntax representing types.
Documentation
use std::str::FromStr;

use crate::{Typing, RustIdent, AsciiIdent, nz, UniversalType, ExtensionType, Error};

type AsciiTy = Typing<AsciiIdent>;
type RustTy = Typing<RustIdent>;

fn test_parsing() {
    let s = "";
    assert!(RustTy::from_str(s) == Err(Error::Empty));

    let s = "foöbár";
    assert!(RustTy::from_str(s) == Ok(RustTy::Named(s.to_owned())));
    assert!(AsciiTy::from_str(s) == Err(Error::ValidationFailed));

    let s = "int";
    assert!(RustTy::from_str(s) == Ok(RustTy::Common(UniversalType::ISize)));

    let s = "uint32";
    assert!(RustTy::from_str(s) == Ok(RustTy::Common(UniversalType::UInt(nz!(4)))));

    let s = "+decimal";
    assert!(RustTy::from_str(s) == Ok(RustTy::Extension(ExtensionType::Decimal)));

    let s = "[]vec2";
    assert!(RustTy::from_str(s) == Ok(RustTy::Vec(RustTy::Named("vec2".to_owned()).boxed())));

    let s = "[42]?string";
    assert!(RustTy::from_str(s) == Ok(RustTy::Array(
        42,
        RustTy::Option(
            RustTy::Common(UniversalType::String).boxed()
        ).boxed()
    )));

    let s = "[[[+datetime]]]";
    assert!(RustTy::from_str(s) == Ok(RustTy::Set(
        RustTy::Set(
            RustTy::Set(
                RustTy::Extension(ExtensionType::DateTime).boxed()
            ).boxed()
        ).boxed()
    )));

    let s = "[42e]?(uint8,@smartstring)";
    assert!(RustTy::from_str(s) ==
        Ok(RustTy::Map(
            RustTy::Named("42e".to_owned()).boxed(),
            RustTy::Option(
                RustTy::Tuple(vec![
                    RustTy::Common(UniversalType::UInt(nz!(1))),
                    RustTy::Foreign(RustTy::Named("smartstring".to_owned()).boxed())
                ]).boxed())
            .boxed())
        )
    );

}