2021-10-04 10:58:00 +03:00
|
|
|
/*
|
|
|
|
* Copyright 2021 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
use super::JValue;
|
2022-08-19 12:29:21 +03:00
|
|
|
use crate::CallSeDeErrors;
|
2021-10-04 10:58:00 +03:00
|
|
|
|
2023-12-15 18:23:09 +04:00
|
|
|
use air_interpreter_interface::SerializedCallRequests;
|
2022-08-19 12:29:21 +03:00
|
|
|
use polyplets::SecurityTetraplet;
|
2021-10-04 10:58:00 +03:00
|
|
|
use serde::Deserialize;
|
|
|
|
use serde::Serialize;
|
|
|
|
|
|
|
|
use std::collections::HashMap;
|
|
|
|
|
|
|
|
pub type CallRequests = HashMap<u32, CallRequestParams>;
|
|
|
|
|
|
|
|
/// Contains arguments of a call instruction and all other necessary information
|
|
|
|
/// required for calling a service.
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
|
|
pub struct CallRequestParams {
|
|
|
|
/// Id of a service that should be called.
|
|
|
|
pub service_id: String,
|
|
|
|
|
|
|
|
/// Name of a function from service identified by service_id that should be called.
|
|
|
|
pub function_name: String,
|
|
|
|
|
|
|
|
/// Arguments that should be passed to the function.
|
|
|
|
pub arguments: Vec<JValue>,
|
|
|
|
|
|
|
|
/// Tetraplets that should be passed to the service.
|
|
|
|
pub tetraplets: Vec<Vec<SecurityTetraplet>>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl CallRequestParams {
|
|
|
|
pub fn new(
|
2021-11-29 18:35:11 +03:00
|
|
|
service_id: impl Into<String>,
|
|
|
|
function_name: impl Into<String>,
|
2021-10-04 10:58:00 +03:00
|
|
|
arguments: Vec<JValue>,
|
|
|
|
tetraplets: Vec<Vec<SecurityTetraplet>>,
|
|
|
|
) -> Self {
|
|
|
|
Self {
|
2021-11-29 18:35:11 +03:00
|
|
|
service_id: service_id.into(),
|
|
|
|
function_name: function_name.into(),
|
2021-10-04 10:58:00 +03:00
|
|
|
arguments,
|
|
|
|
tetraplets,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(crate) fn from_raw(
|
|
|
|
call_params: air_interpreter_interface::CallRequestParams,
|
2022-08-19 12:29:21 +03:00
|
|
|
) -> Result<Self, CallSeDeErrors> {
|
2023-12-15 18:23:09 +04:00
|
|
|
use air_interpreter_interface::CallArgumentsRepr;
|
|
|
|
use air_interpreter_interface::TetrapletsRepr;
|
|
|
|
use air_interpreter_sede::FromSerialized;
|
|
|
|
|
|
|
|
let arguments: Vec<JValue> = CallArgumentsRepr
|
|
|
|
.deserialize(&call_params.arguments)
|
|
|
|
.map_err(|de_error| CallSeDeErrors::CallParamsArgsDeFailed {
|
|
|
|
call_params: call_params.clone(),
|
|
|
|
de_error,
|
2021-10-04 10:58:00 +03:00
|
|
|
})?;
|
|
|
|
|
2023-12-15 18:23:09 +04:00
|
|
|
let tetraplets: Vec<Vec<SecurityTetraplet>> = TetrapletsRepr
|
|
|
|
.deserialize(&call_params.tetraplets)
|
2021-10-04 10:58:00 +03:00
|
|
|
.map_err(|de_error| CallSeDeErrors::CallParamsTetrapletsDeFailed {
|
|
|
|
call_params: call_params.clone(),
|
|
|
|
de_error,
|
|
|
|
})?;
|
|
|
|
|
|
|
|
let call_params = Self {
|
|
|
|
service_id: call_params.service_id,
|
|
|
|
function_name: call_params.function_name,
|
|
|
|
arguments,
|
|
|
|
tetraplets,
|
|
|
|
};
|
|
|
|
|
|
|
|
Ok(call_params)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-19 12:29:21 +03:00
|
|
|
pub(crate) fn from_raw_call_requests(
|
2023-12-15 18:23:09 +04:00
|
|
|
raw_call_params: SerializedCallRequests,
|
2022-08-19 12:29:21 +03:00
|
|
|
) -> Result<CallRequests, CallSeDeErrors> {
|
2023-12-15 18:23:09 +04:00
|
|
|
use air_interpreter_interface::CallRequestsRepr;
|
|
|
|
use air_interpreter_sede::FromSerialized;
|
|
|
|
|
2021-10-04 10:58:00 +03:00
|
|
|
let call_requests: air_interpreter_interface::CallRequests =
|
2023-12-15 18:23:09 +04:00
|
|
|
match CallRequestsRepr.deserialize(&raw_call_params) {
|
2021-10-04 10:58:00 +03:00
|
|
|
Ok(requests) => requests,
|
|
|
|
Err(error) => {
|
|
|
|
return Err(CallSeDeErrors::CallRequestsDeError {
|
|
|
|
raw_call_request: raw_call_params,
|
|
|
|
error,
|
|
|
|
})
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
call_requests
|
|
|
|
.into_iter()
|
2022-08-19 12:29:21 +03:00
|
|
|
.map(|(call_id, call_params)| -> Result<_, _> {
|
2021-10-04 10:58:00 +03:00
|
|
|
let call_params = CallRequestParams::from_raw(call_params)?;
|
|
|
|
Ok((call_id, call_params))
|
|
|
|
})
|
|
|
|
.collect::<Result<_, _>>()
|
|
|
|
}
|