aquavm/interpreter-lib/src/contexts/execution_context.rs

130 lines
4.0 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-01-15 00:38:58 +03:00
mod avalue;
pub(crate) use avalue::AValue;
pub(crate) use avalue::ResolvedCallResult;
2020-10-15 17:31:56 +03:00
2021-02-11 15:39:37 +03:00
use crate::execution::ExecutionError;
use crate::SecurityTetraplet;
use serde::Deserialize;
use serde::Serialize;
2020-10-15 17:31:56 +03:00
use std::collections::HashMap;
use std::collections::VecDeque;
2020-10-15 17:31:56 +03:00
2021-02-11 15:39:37 +03:00
use std::rc::Rc;
2020-12-22 21:05:04 +03:00
/// Contains all necessary state needed to execute aqua script.
2021-02-11 15:39:37 +03:00
#[derive(Default)]
2020-11-03 17:43:58 +03:00
pub(crate) struct ExecutionCtx<'i> {
2020-10-23 12:41:58 +03:00
/// Contains all set variables.
2020-12-22 21:05:04 +03:00
// TODO: use shared string (Rc<String>) to avoid copying.
2020-11-03 17:43:58 +03:00
pub data_cache: HashMap<String, AValue<'i>>,
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
2020-11-11 14:31:53 +03:00
/// PeerId of a peer executing this aqua script at the moment.
2020-10-15 17:31:56 +03:00
pub current_peer_id: String,
2020-10-23 12:41:58 +03:00
2020-11-11 14:31:53 +03:00
/// PeerId of a peer send this aqua script.
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
/// - at least one of xor substree is completed without an error
/// - 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>,
2020-10-15 17:31:56 +03:00
}
2021-02-11 15:39:37 +03:00
#[derive(Debug)]
pub(crate) struct LastErrorDescriptor {
pub(crate) error: Rc<ExecutionError>,
pub(crate) instruction: String,
pub(crate) tetraplet: Option<SecurityTetraplet>,
}
impl LastErrorDescriptor {
pub(crate) fn new(error: Rc<ExecutionError>, instruction: String, tetraplet: Option<SecurityTetraplet>) -> Self {
Self {
error,
instruction,
tetraplet,
}
}
pub(crate) fn serialize(&self) -> String {
#[derive(Serialize, Deserialize)]
pub(crate) struct LastError<'s> {
pub(crate) error: String,
pub(crate) instruction: &'s str,
}
let error = format!("{}", &self.error);
let error_with_location = LastError {
error,
instruction: &self.instruction,
};
serde_json::to_string(&error_with_location).expect("default serializer shouldn't fail")
}
}
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 {
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
}
}
}
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:")?;
for (key, value) in self.data_cache.iter() {
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(())
}
}