use std::ops::{RangeInclusive, Range};
use serde::{Serialize, Deserialize};
use shm_rs::lexer::lexer;
use shm_rs::serializator::serializator;
use shm_rs::static_scheme::init;
use shm_rs::dynamic_scheme::environment;
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct CommonLevels
{
    pub lvl_a: Range<i64>,
    pub lvl_b: RangeInclusive<u64>
}
pub fn main()
{
    let mut curdir = std::env::current_dir().unwrap();
    curdir.push("examples/test4.shm");
    println!("{}", curdir.display());
    let lex = lexer::Lexer::from_file(curdir).unwrap();
    let schm = init::SchemeInit::new().unwrap();
    let res = schm.run(&lex, None).unwrap();
    let resser = res.get("test10").unwrap().clone();
    println!("Static: \n{:?}\n", res);
    let mut curdir = std::env::current_dir().unwrap();
    curdir.push("examples/test11.shm");
    let lex = lexer::Lexer::from_file(curdir).unwrap();
    let dynenv = environment::DynEnvironment::new_root(resser.clone());
    let dynres = environment::DynEnvironment::run(&lex, dynenv).unwrap();
    println!("Dynamic: \n{:?}\n", dynres);
    let ret = serializator::Serialization::serialize(resser, dynres.clone()).unwrap();
    let serialized = serde_json::to_string(&ret).unwrap();
    let tr = CommonLevels{lvl_a: -2..8, lvl_b: 4..=5};
    let res = serde_json::to_string(&tr).unwrap();
    println!("control: {}", res);
    let deser: CommonLevels = serde_json::from_str(&serialized).unwrap();
    println!("{:?}", deser);
    if deser != tr 
    {
        println!("did not match!");
    }
}