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

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

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