rasta 0.1.2

UAST implemention
Documentation
mod defs;
mod expr;
mod program;
mod stmt;
mod types;

pub use defs::*;
pub use expr::*;
pub use program::*;
pub use stmt::*;
pub use types::*;

use serde_derive::*;

pub fn serialize(unit: &CompUnit) -> Vec<u8> {
    rmp_serde::to_vec(unit).unwrap()
}

pub fn deserialize(data: Vec<u8>) -> CompUnit {
    rmp_serde::from_slice(&data).unwrap()
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Span {
    start: (usize,usize),
    end: (usize,usize),
    string: String,
    file: String,
}

impl Span {
    pub fn new(start: (usize,usize), end: (usize,usize), code: String, file: String) -> Self {
        Self {
            start,
            end,
            string: code,
            file,
        }
    }
}

impl core::fmt::Display for Span {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f,"\x1b[1;34m---> \x1b[0m{}:{}:{}\x1b[1;34m\n",self.file,self.start.0,self.start.1)?;

        let num_len = format!("{}", self.start.0).len();
        
        for _ in 0..=num_len {
            write!(f, " ")?;
        }
        write!(f,"|\n")?;

        write!(f, "{} | \x1b[0m{}\x1b[1;34m", self.start.0,self.string)?;

        for _ in 0..=num_len {
            write!(f, " ")?;
        }
        write!(f,"| ")?;

        for _ in 0..self.start.1-1 {
            write!(f, " ")?;
        }

        for _ in self.start.1..self.end.1 {
            write!(f, "\x1b[1;31m^\x1b[1;34m")?;
        }
        Ok(())
    }
    
}