watson_rs 0.1.0

Rust implementation for Wasted but Amazing Turing-incomplete Stack-based Object Notation (WATSON)
Documentation
use std::str::FromStr;

pub mod error;
pub mod language;
pub mod lexer;
pub mod serializer;
pub mod unlexer;
pub mod vm;

pub use error::{Error, ErrorKind, Result};
pub use language::{Bytes, Insn, IsValue, Location, Map, ToBytes, Token, Value};
pub use vm::VM;

impl FromStr for Value {
    type Err = Error;

    fn from_str(s: &str) -> Result<Value> {
        let mut bytes = s.as_bytes();
        let mut vm = vm::VM::new();
        vm.execute_all(lexer::Lexer::new(&mut bytes))?;
        vm.into_top().map(Ok).unwrap_or_else(|| {
            Err(Error {
                kind: ErrorKind::EmptyStack,
                location: Location::unknown(),
                source: None,
            })
        })
    }
}

#[cfg(test)]
mod test {
    use crate::*;

    use Value::*;

    #[test]
    fn parse_watson() -> Result<()> {
        assert_eq!("B".parse::<Value>()?, Int(0));
        assert_eq!("BBubba".parse::<Value>()?, Int(4));
        assert_eq!("?SShaaarrk".parse::<Value>()?, Int(8));
        Ok(())
    }
}