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

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