1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#[macro_use]
extern crate log;
#[macro_use]
extern crate clap;
#[macro_use]
extern crate lazy_static;

use crate::link::Link;
use crate::markup::MarkupFile;
pub mod cli;
pub mod file_traversal;
pub mod link;
pub mod link_extractor;
pub mod link_validator;
pub mod logger;
pub mod markup;
pub use colored::*;

#[derive(Default)]
pub struct Config {
    pub log_level: logger::LogLevel,
    pub folder: String,
    pub markup_types: Vec<markup::MarkupType>,
}

#[derive(Debug, PartialEq)]
pub enum LinkCheckResult {
    Ok(String),
    Failed(String),
    NotImplemented(String),
}

impl LinkCheckResult {
    pub fn success(&self) -> bool {
        match self {
            LinkCheckResult::Ok(..) => true,
            _ => false,
        }
    }
}

pub fn run(config: &Config) -> Result<(), ()> {
    let mut files: Vec<MarkupFile> = Vec::new();
    file_traversal::find(&config, &mut files);

    let mut links: Vec<Link> = Vec::new();
    for file in files {
        links.append(&mut link_extractor::find_links(&file));
    }

    let mut result = Vec::new();
    for link in &links {
        result.push(link_validator::check(link));
    }

    let mut invalid_links = vec![];
    let mut warnings = 0;
    for res in &result {
        match res {
            LinkCheckResult::Ok(val) => {
                println!("{} {}", "OK".green(), val);
            }
            LinkCheckResult::NotImplemented(err) => {
                println!("{} {}", "Warning".yellow(), err);
                warnings += 1;
            }
            LinkCheckResult::Failed(err) => {
                eprintln!("{} {}", "Error".red(), err);
                invalid_links.push(err);
            }
        }
    }

    println!("");
    println!("Result");
    println!("");
    println!("Links: {}", &result.len());
    println!("Warnings: {}", warnings);
    println!("Errors: {}", &invalid_links.len());

    if !invalid_links.is_empty() {
        eprintln!("");
        eprintln!("The following links could not be resolved:");
        for il in invalid_links {
            eprintln!("   {} {}", "Error".red(), il);
        }
        Err(())
    } else {
        Ok(())
    }
}