aqua_interpreter_interface/
lib.rs1use fluence::fce;
18
19use fluence_it_types::IValue;
20use serde::Deserialize;
21use serde::Serialize;
22
23pub const INTERPRETER_SUCCESS: i32 = 0;
24
25#[fce]
27#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
28pub struct InterpreterOutcome {
29 pub ret_code: i32,
31
32 pub error_message: String,
34
35 pub data: Vec<u8>,
38
39 pub next_peer_pks: Vec<String>,
41}
42
43impl InterpreterOutcome {
44 pub fn from_ivalues(mut ivalues: Vec<IValue>) -> Result<Self, String> {
45 const OUTCOME_FIELDS_COUNT: usize = 4;
46
47 let record_values = match ivalues.remove(0) {
48 IValue::Record(record_values) => record_values,
49 v => {
50 return Err(format!(
51 "expected record for InterpreterOutcome, got {:?}",
52 v
53 ))
54 }
55 };
56
57 let mut record_values = record_values.into_vec();
58 if record_values.len() != OUTCOME_FIELDS_COUNT {
59 return Err(format!(
60 "expected InterpreterOutcome struct with {} fields, got {:?}",
61 OUTCOME_FIELDS_COUNT, record_values
62 ));
63 }
64
65 let ret_code = match record_values.remove(0) {
66 IValue::S32(ret_code) => ret_code,
67 v => return Err(format!("expected i32 for ret_code, got {:?}", v)),
68 };
69
70 let error_message = match record_values.remove(0) {
71 IValue::String(str) => str,
72 v => return Err(format!("expected string for data, got {:?}", v)),
73 };
74
75 let data = match record_values.remove(0) {
76 IValue::Array(array) => {
77 let array: Result<Vec<_>, _> = array
78 .into_iter()
79 .map(|v| match v {
80 IValue::U8(byte) => Ok(byte),
81 v => Err(format!("expected a byte, got {:?}", v)),
82 })
83 .collect();
84 array?
85 }
86 IValue::ByteArray(array) => array,
87 v => return Err(format!("expected Vec<u8> for data, got {:?}", v)),
88 };
89
90 let next_peer_pks = match record_values.remove(0) {
91 IValue::Array(ar_values) => {
92 let array = ar_values
93 .into_iter()
94 .map(|v| match v {
95 IValue::String(str) => Ok(str),
96 v => Err(format!("expected string for next_peer_pks, got {:?}", v)),
97 })
98 .collect::<Result<Vec<String>, _>>()?;
99
100 Ok(array)
101 }
102 v => Err(format!("expected array for next_peer_pks, got {:?}", v)),
103 }?;
104
105 let outcome = Self {
106 ret_code,
107 error_message,
108 data,
109 next_peer_pks,
110 };
111
112 Ok(outcome)
113 }
114}