use super::ExecutionCtx;
use super::ExecutionResult;
use crate::execution_step::resolver::Resolvable;
use crate::execution_step::CatchableError;
use crate::JValue;
use air_parser::ast;
use polyplets::ResolvedTriplet;
pub(crate) fn resolve<'i>(triplet: &ast::Triplet<'i>, ctx: &ExecutionCtx<'i>) -> ExecutionResult<ResolvedTriplet> {
let ast::Triplet {
peer_id: peer_pk,
service_id,
function_name,
} = triplet;
let peer_pk = resolve_peer_id_to_string(peer_pk, ctx)?;
let service_id = resolve_to_string(service_id, ctx)?;
let function_name = resolve_to_string(function_name, ctx)?;
Ok(ResolvedTriplet {
peer_pk,
service_id,
function_name,
})
}
pub(crate) fn resolve_peer_id_to_string<'i>(
value: &ast::ResolvableToPeerIdVariable<'i>,
exec_ctx: &ExecutionCtx<'i>,
) -> ExecutionResult<String> {
use ast::ResolvableToPeerIdVariable::*;
let ((jvalue, _, _), name) = match value {
InitPeerId => return Ok(exec_ctx.run_parameters.init_peer_id.to_string()),
Literal(value) => return Ok(value.to_string()),
Scalar(scalar) => (scalar.resolve(exec_ctx)?, scalar.name),
ScalarWithLambda(scalar) => (scalar.resolve(exec_ctx)?, scalar.name),
CanonStreamWithLambda(canon_stream) => (canon_stream.resolve(exec_ctx)?, canon_stream.name),
CanonStreamMapWithLambda(canon_stream_map) => (canon_stream_map.resolve(exec_ctx)?, canon_stream_map.name),
};
try_jvalue_to_string(jvalue, name)
}
pub(crate) fn resolve_to_string<'i>(
value: &ast::ResolvableToStringVariable<'i>,
exec_ctx: &ExecutionCtx<'i>,
) -> ExecutionResult<String> {
use ast::ResolvableToStringVariable::*;
let ((jvalue, _, _), name) = match value {
Literal(value) => return Ok(value.to_string()),
Scalar(scalar) => (scalar.resolve(exec_ctx)?, scalar.name),
ScalarWithLambda(scalar) => (scalar.resolve(exec_ctx)?, scalar.name),
CanonStreamWithLambda(canon_stream) => (canon_stream.resolve(exec_ctx)?, canon_stream.name),
CanonStreamMapWithLambda(canon_stream_map) => (canon_stream_map.resolve(exec_ctx)?, canon_stream_map.name),
};
try_jvalue_to_string(jvalue, name)
}
fn try_jvalue_to_string(jvalue: JValue, variable_name: impl Into<String>) -> ExecutionResult<String> {
match jvalue {
JValue::String(s) => Ok(s.to_string()),
_ => Err(CatchableError::NonStringValueInTripletResolution {
variable_name: variable_name.into(),
actual_value: jvalue,
}
.into()),
}
}