use super::ExecutionCtx;
use super::ExecutionResult;
use super::TraceHandler;
use crate::log_instruction;
use air_parser::ast::New;
use air_parser::ast::NewArgument;
impl<'i> super::ExecutableInstruction<'i> for New<'i> {
fn execute(&self, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
log_instruction!(new, exec_ctx, trace_ctx);
prolog(self, exec_ctx);
let instruction_result = self.instruction.execute(exec_ctx, trace_ctx);
let epilog_result = epilog(self, exec_ctx, trace_ctx);
match (instruction_result, epilog_result) {
(Ok(()), Ok(())) => Ok(()),
(err @ Err(_), _) => err,
(_, err @ Err(_)) => err,
}
}
}
fn prolog<'i>(new: &New<'i>, exec_ctx: &mut ExecutionCtx<'i>) {
let position = new.span.left;
match &new.argument {
NewArgument::Stream(stream) => exec_ctx.streams.meet_scope_start(stream.name, new.span),
NewArgument::StreamMap(stream_map) => exec_ctx.stream_maps.meet_scope_start(stream_map.name, new.span),
NewArgument::Scalar(scalar) => exec_ctx.scalars.meet_new_start_scalar(scalar.name.to_string()),
NewArgument::CanonStream(canon_stream) => exec_ctx
.scalars
.meet_new_start_canon_stream(canon_stream.name.to_string()),
NewArgument::CanonStreamMap(canon_stream_map) => exec_ctx
.scalars
.meet_new_start_canon_stream_map(canon_stream_map.name.to_string()),
}
exec_ctx.tracker.meet_new(position);
}
fn epilog<'i>(new: &New<'i>, exec_ctx: &mut ExecutionCtx<'i>, trace_ctx: &mut TraceHandler) -> ExecutionResult<()> {
match &new.argument {
NewArgument::Stream(stream) => exec_ctx.streams.meet_scope_end(stream.name.to_string(), trace_ctx),
NewArgument::StreamMap(stream_map) => exec_ctx
.stream_maps
.meet_scope_end(stream_map.name.to_string(), trace_ctx),
NewArgument::Scalar(scalar) => exec_ctx.scalars.meet_new_end_scalar(scalar.name),
NewArgument::CanonStream(canon_stream) => exec_ctx.scalars.meet_new_end_canon_stream(canon_stream.name),
NewArgument::CanonStreamMap(canon_stream_map) => {
exec_ctx.scalars.meet_new_end_canon_stream_map(canon_stream_map.name)
}
}
}