Skip to main content

conjure_cp_core/
context.rs

1use std::fmt::{Debug, Formatter};
2use std::sync::{Arc, RwLock};
3
4use derivative::Derivative;
5use schemars::JsonSchema;
6use serde::Serialize;
7use serde_with::skip_serializing_none;
8
9use crate::rule_engine::{RuleData, RuleSet};
10use crate::settings::SolverFamily;
11use 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]
18pub 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
36impl<'a> Context<'a> {
37    pub fn new(
38        target_solver_family: SolverFamily,
39        extra_rule_set_names: Vec<String>,
40        rules: Vec<RuleData<'a>>,
41        rule_sets: Vec<&'a RuleSet<'a>>,
42    ) -> Self {
43        Context {
44            target_solver_family: Some(target_solver_family),
45            extra_rule_set_names,
46            rules,
47            rule_sets,
48            stats: Default::default(),
49            ..Default::default()
50        }
51    }
52}
53
54impl Context<'static> {
55    pub fn new_ptr(
56        target_solver_family: SolverFamily,
57        extra_rule_set_names: Vec<String>,
58        rules: Vec<RuleData<'static>>,
59        rule_sets: Vec<&'static RuleSet<'static>>,
60    ) -> Arc<RwLock<Context<'static>>> {
61        Arc::new(RwLock::new(Context::new(
62            target_solver_family,
63            extra_rule_set_names,
64            rules,
65            rule_sets,
66        )))
67    }
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
79impl 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}