Skip to main content

scratch_test_interpreter/
builder.rs

1mod limits;
2pub use limits::Limits;
3
4use smodel::ProjectDoc;
5
6use crate::{State, error::RunError, interpreter::RunningInterpreter};
7
8#[derive(Debug, PartialEq, Clone)]
9pub struct Interpreter {
10    limits: Limits,
11}
12
13#[derive(Debug, derive_getters::Getters)]
14#[allow(unused)]
15pub struct Report<'a, S: State> {
16    doc: &'a ProjectDoc,
17    state: S,
18    error_code: Option<RunError<S::Error>>,
19    limits: Limits,
20}
21
22impl<'a, S: State> Report<'a, S> {
23    pub fn take_parts(self) -> (S, Option<RunError<S::Error>>, Limits) {
24        (self.state, self.error_code, self.limits)
25    }
26}
27
28#[allow(unused)]
29impl Interpreter {
30    pub fn new_restrictive() -> Self {
31        Self {
32            limits: Limits::RESTRICTIVE,
33        }
34    }
35    pub fn run<'a, S: State>(
36        self,
37        doc: &'a ProjectDoc,
38        state: S,
39        initial_block: &'a smodel::Id,
40    ) -> Report<'a, S> {
41        let mut running = RunningInterpreter::new(self.limits, doc, state, initial_block);
42        let error_code = running.internal_start().err();
43        Report {
44            doc,
45            state: running.state,
46            error_code,
47            limits: running.limits,
48        }
49    }
50    pub const fn limits_mut(&mut self) -> &mut Limits {
51        &mut self.limits
52    }
53    pub const fn limits(&mut self) -> &Limits {
54        &self.limits
55    }
56    pub const fn set_limits(&mut self, limits: Limits) -> &mut Self {
57        self.limits = limits;
58        self
59    }
60    pub const fn with_limits(mut self, limits: Limits) -> Self {
61        self.limits = limits;
62        self
63    }
64    pub fn change_limits(mut self, f: impl FnOnce(Limits) -> Limits) -> Self {
65        self.limits = f(self.limits);
66        self
67    }
68}