rust_rest_test 0.1.1

An executable that can be used to run "unit tests" on a rust api
use crate::parser::types::{Tabs, TestClass, Whitespace};
use crate::parser::{Parser, Token};
use crate::tester;
use crate::tester::Tester;
use std::fs;

pub fn run_testfile(filename: String, url: String) {
    println!("----------------------------------------------------------------");
    println!("Testing file: {}", filename);
    println!("----------------------------------------------------------------");
    let all_testers = parse_testers_for_file_or_panic(filename);

    for (identifier, t) in all_testers {
        print_test_title(&identifier, &url, &t);
        tester::runner::run(url.clone(), t);
    }
}

fn print_test_title(identifier: &String, url: &String, tester: &Tester) {
    let url_postfix = tester
        .request_info
        .url_postfix
        .clone()
        .unwrap_or("".to_string());
    println!("{}{} :: {}", url, url_postfix, identifier);
}

fn parse_testers_for_file_or_panic(filename: String) -> Vec<(String, Tester)> {
    let contents =
        fs::read_to_string(filename).expect("File not found. This shouldn't be possible.");

    let mut split: Vec<(usize, &str)> = contents
        .split('\n')
        .filter(|s| not_empty(s))
        .map(|s| {
            let len = get_tabs(s);
            (len, &s[len..])
        })
        .rev()
        .collect();

    let mut test_class = TestClass::match_token("").unwrap();
    let success = test_class.match_next(&mut split, "");
    if success.is_err() {
        panic!("Couldn't parse file:");
    }

    let all_testers = test_class.get_all_testers();
    if all_testers.len() == 0 {
        panic!("No test cases");
    }

    all_testers
}

fn get_tabs(s: &str) -> usize {
    match Tabs::match_token(s) {
        Ok(t) => t.size(),
        Err(_) => 0,
    }
}

fn not_empty(s: &str) -> bool {
    Whitespace::match_token(s).is_err()
}