scratch_test_interpreter/
builder.rs1mod 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}