1
use std::fmt::{Debug, Formatter};
2
use std::sync::{Arc, RwLock};
3

            
4
use derivative::Derivative;
5
use schemars::JsonSchema;
6
use serde::Serialize;
7
use serde_with::skip_serializing_none;
8

            
9
use crate::rule_engine::{RuleData, RuleSet};
10
use crate::settings::SolverFamily;
11
use crate::stats::Stats;
12

            
13
#[skip_serializing_none]
14
#[derive(Clone, Serialize, Default, Derivative, JsonSchema)]
15
#[serde(rename_all = "camelCase")]
16
#[derivative(Eq, PartialEq)]
17
#[non_exhaustive]
18
pub struct Context<'a> {
19
    pub target_solver_family: Option<SolverFamily>,
20

            
21
    pub essence_file_name: Option<String>,
22
    pub param_file_name: Option<String>,
23

            
24
    pub extra_rule_set_names: Vec<String>,
25

            
26
    #[serde(skip)]
27
    pub rules: Vec<RuleData<'a>>,
28

            
29
    #[serde(skip)]
30
    pub rule_sets: Vec<&'a RuleSet<'a>>,
31

            
32
    #[derivative(PartialEq = "ignore")]
33
    pub stats: Stats,
34
}
35

            
36
impl<'a> Context<'a> {
37
181
    pub fn new(
38
181
        target_solver_family: SolverFamily,
39
181
        extra_rule_set_names: Vec<String>,
40
181
        rules: Vec<RuleData<'a>>,
41
181
        rule_sets: Vec<&'a RuleSet<'a>>,
42
181
    ) -> Self {
43
181
        Context {
44
181
            target_solver_family: Some(target_solver_family),
45
181
            extra_rule_set_names,
46
181
            rules,
47
181
            rule_sets,
48
181
            stats: Default::default(),
49
181
            ..Default::default()
50
181
        }
51
181
    }
52
}
53

            
54
impl Context<'static> {
55
180
    pub fn new_ptr(
56
180
        target_solver_family: SolverFamily,
57
180
        extra_rule_set_names: Vec<String>,
58
180
        rules: Vec<RuleData<'static>>,
59
180
        rule_sets: Vec<&'static RuleSet<'static>>,
60
180
    ) -> Arc<RwLock<Context<'static>>> {
61
180
        Arc::new(RwLock::new(Context::new(
62
180
            target_solver_family,
63
180
            extra_rule_set_names,
64
180
            rules,
65
180
            rule_sets,
66
        )))
67
180
    }
68

            
69
1
    pub fn new_ptr_empty(target_solver_family: SolverFamily) -> Arc<RwLock<Context<'static>>> {
70
1
        Arc::new(RwLock::new(Context::new(
71
1
            target_solver_family,
72
1
            vec![],
73
1
            vec![],
74
1
            vec![],
75
        )))
76
1
    }
77
}
78

            
79
impl Debug for Context<'_> {
80
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
81
        let target_solver_family: Option<SolverFamily> = self.target_solver_family;
82
        let extra_rule_set_names: Vec<String> = self.extra_rule_set_names.clone();
83
        let rules: Vec<&str> = self.rules.iter().map(|rd| rd.rule.name).collect();
84
        let rule_sets: Vec<&str> = self.rule_sets.iter().map(|r| r.name).collect();
85

            
86
        write!(
87
            f,
88
            "Context {{\n\
89
            \ttarget_solver_family: {target_solver_family:?}\n\
90
            \textra_rule_set_names: {extra_rule_set_names:?}\n\
91
            \trules: {rules:?}\n\
92
            \trule_sets: {rule_sets:?}\n\
93
        }}"
94
        )
95
    }
96
}