108 lines
3.6 KiB
Rust
Raw Normal View History

2020-10-15 17:31:56 +03:00
/*
* Copyright 2020 Fluence Labs Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
2021-08-24 16:14:15 +03:00
use super::InstrTracker;
use super::LastErrorDescriptor;
use super::LastErrorWithTetraplet;
use crate::execution_step::boxed_value::Scalar;
use crate::execution_step::boxed_value::Stream;
2021-02-11 15:39:37 +03:00
2021-08-24 16:14:15 +03:00
use std::cell::RefCell;
2020-10-15 17:31:56 +03:00
use std::collections::HashMap;
use std::collections::VecDeque;
2021-08-24 16:14:15 +03:00
use std::rc::Rc;
2020-10-15 17:31:56 +03:00
/// Contains all necessary state needed to execute AIR script.
2021-02-11 15:39:37 +03:00
#[derive(Default)]
2020-11-03 17:43:58 +03:00
pub(crate) struct ExecutionCtx<'i> {
2021-08-24 16:14:15 +03:00
/// Contains all scalars.
// TODO: use shared string (Rc<String>) to avoid copying.
pub scalars: HashMap<String, Scalar<'i>>,
/// Contains all streams.
2020-12-22 21:05:04 +03:00
// TODO: use shared string (Rc<String>) to avoid copying.
2021-08-24 16:14:15 +03:00
pub streams: HashMap<String, RefCell<Stream>>,
2020-10-23 12:41:58 +03:00
/// Set of peer public keys that should receive resulted data.
2020-10-15 17:31:56 +03:00
pub next_peer_pks: Vec<String>,
2020-10-23 12:41:58 +03:00
/// PeerId of a peer executing this AIR script at the moment.
2021-08-24 16:14:15 +03:00
pub current_peer_id: Rc<String>,
2020-10-23 12:41:58 +03:00
/// PeerId of a peer send this AIR script.
2020-11-11 14:31:53 +03:00
pub init_peer_id: String,
2021-02-11 15:39:37 +03:00
/// Last error produced by local service.
/// None means that there weren't any error.
pub last_error: Option<LastErrorDescriptor>,
2021-02-16 20:04:00 +03:00
/// True, if last error could be set. This flag is used to distinguish
/// whether an error is being bubbled up from the bottom or just encountered.
pub last_error_could_be_set: bool,
2020-10-23 12:41:58 +03:00
/// Indicates that previous executed subtree is complete.
/// A subtree treats as a complete if all subtree elements satisfy the following rules:
2021-01-15 00:38:58 +03:00
/// - at least one of par subtrees is completed
2021-08-24 16:14:15 +03:00
/// - at least one of xor subtrees is completed without an error
2021-01-15 00:38:58 +03:00
/// - all of seq subtrees are completed
/// - call executed successfully (executed state is Executed)
2020-10-23 12:41:58 +03:00
pub subtree_complete: bool,
/// List of met folds used to determine whether a variable can be shadowed.
pub met_folds: VecDeque<&'i str>,
2021-08-24 16:14:15 +03:00
/// Tracker of all met instructions.
pub tracker: InstrTracker,
2020-10-15 17:31:56 +03:00
}
2020-11-03 17:43:58 +03:00
impl<'i> ExecutionCtx<'i> {
2020-11-11 14:31:53 +03:00
pub(crate) fn new(current_peer_id: String, init_peer_id: String) -> Self {
2021-08-24 16:14:15 +03:00
let current_peer_id = Rc::new(current_peer_id);
2020-10-15 17:31:56 +03:00
Self {
current_peer_id,
2020-11-11 14:31:53 +03:00
init_peer_id,
2020-10-23 12:41:58 +03:00
subtree_complete: true,
2021-02-16 20:04:00 +03:00
last_error_could_be_set: true,
2021-02-11 15:39:37 +03:00
..<_>::default()
2020-10-15 17:31:56 +03:00
}
}
2021-06-02 14:33:21 +03:00
2021-08-24 16:14:15 +03:00
pub(crate) fn last_error(&self) -> LastErrorWithTetraplet {
2021-06-02 14:33:21 +03:00
match &self.last_error {
2021-08-24 16:14:15 +03:00
Some(error_descriptor) => LastErrorWithTetraplet::from_error_descriptor(error_descriptor, self),
2021-06-02 14:33:21 +03:00
None => <_>::default(),
}
}
2020-10-15 17:31:56 +03:00
}
2020-10-30 20:29:05 +03:00
2021-01-15 00:38:58 +03:00
use std::fmt::Display;
use std::fmt::Formatter;
2020-11-03 17:43:58 +03:00
impl<'i> Display for ExecutionCtx<'i> {
2020-10-30 20:29:05 +03:00
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
writeln!(f, "data cache:")?;
2021-08-24 16:14:15 +03:00
for (key, value) in self.scalars.iter() {
2020-10-30 20:29:05 +03:00
writeln!(f, " {} => {}", key, value)?;
}
writeln!(f, "current peer id: {}", self.current_peer_id)?;
writeln!(f, "subtree complete: {}", self.subtree_complete)?;
writeln!(f, "next peer public keys: {:?}", self.next_peer_pks)?;
Ok(())
}
}