smt_lang/
lib.rs

1pub mod error;
2pub mod parser;
3pub mod problem;
4pub mod solution;
5pub mod solve;
6
7pub mod combine;
8pub use combine::*;
9
10#[macro_use]
11extern crate lalrpop_util;
12
13pub fn ok_entry<S: Into<String>>(title: S) -> d_stuff::Entry {
14    let title = d_stuff::Text::new(
15        title,
16        termion::style::Bold.to_string(),
17        termion::color::Blue.fg_str(),
18    );
19    let message = d_stuff::Text::new(
20        "OK",
21        termion::style::Reset.to_string(),
22        termion::color::Green.fg_str(),
23    );
24    d_stuff::Entry::new(d_stuff::Status::Success, title, Some(message), vec![])
25}
26
27pub fn load_file(
28    pretty: &mut d_stuff::Pretty,
29    problem: &mut problem::Problem,
30    filename: &str,
31    verbose: u8,
32) -> Result<(), error::Error> {
33    // Parsing
34    match parser::parse_file(problem, filename) {
35        Ok(_) => {
36            if verbose >= 2 {
37                pretty.add(ok_entry("Parse    "));
38                pretty.print();
39            }
40        }
41        Err(e) => return Err(e),
42    }
43    // Resolve Type
44    match problem.resolve_type() {
45        Ok(_) => {
46            if verbose >= 2 {
47                pretty.add(ok_entry("Resolve T"));
48                pretty.print();
49            }
50        }
51        Err(e) => return Err(e),
52    }
53    // Check Cycle
54    match problem.check_cycle() {
55        Ok(_) => {
56            if verbose >= 2 {
57                pretty.add(ok_entry("Cycle    "));
58                pretty.print();
59            }
60        }
61        Err(e) => return Err(e),
62    }
63    // Duplicate
64    match problem.duplicate() {
65        Ok(_) => {
66            if verbose >= 2 {
67                pretty.add(ok_entry("Unicity  "));
68                pretty.print();
69            }
70        }
71        Err(e) => return Err(e),
72    }
73    // Check Interval
74    match problem.check_interval() {
75        Ok(_) => {
76            if verbose >= 2 {
77                pretty.add(ok_entry("Interval "));
78                pretty.print();
79            }
80        }
81        Err(e) => return Err(e),
82    }
83    // Check Bounded
84    match problem.check_bounded() {
85        Ok(_) => {
86            if verbose >= 2 {
87                pretty.add(ok_entry("Bounded  "));
88                pretty.print();
89            }
90        }
91        Err(e) => return Err(e),
92    }
93    // ------------------------- Preprocess ? -------------------------
94
95    // Check Empty
96    match problem.check_empty() {
97        Ok(_) => {
98            if verbose >= 2 {
99                pretty.add(ok_entry("Empty    "));
100                pretty.print();
101            }
102        }
103        Err(e) => return Err(e),
104    }
105
106    // resolve Expr
107    match problem.resolve_expr() {
108        Ok(_) => {
109            if verbose >= 2 {
110                pretty.add(ok_entry("Resolve E"));
111                pretty.print();
112            }
113        }
114        Err(e) => return Err(e),
115    }
116    // Check Parameter Size
117    match problem.check_parameter_size() {
118        Ok(_) => {
119            if verbose >= 2 {
120                pretty.add(ok_entry("Parameter"));
121                pretty.print();
122            }
123        }
124        Err(e) => return Err(e),
125    }
126    // Check Type
127    match problem.check_type() {
128        Ok(_) => {
129            if verbose >= 2 {
130                pretty.add(ok_entry("Type     "));
131                pretty.print();
132            }
133        }
134        Err(e) => return Err(e),
135    }
136
137    Ok(())
138}