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

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