multiversx_chain_vm/host/vm_hooks/vh_handler/
vh_error.rs

1use multiversx_chain_core::types::ReturnCode;
2use multiversx_chain_vm_executor::VMHooksEarlyExit;
3
4use crate::{
5    host::vm_hooks::{vh_early_exit::early_exit_vm_error, VMHooksContext},
6    types::RawHandle,
7};
8
9use super::VMHooksHandler;
10
11impl<C: VMHooksContext> VMHooksHandler<C> {
12    pub fn signal_error(&mut self, message: &[u8]) -> Result<(), VMHooksEarlyExit> {
13        // can sometimes help in tests
14        // run `clear & cargo test -- --nocapture` to see the output
15        println!("{}", std::str::from_utf8(message).unwrap());
16
17        match String::from_utf8(message.to_owned()) {
18            Ok(message_string) => {
19                Err(VMHooksEarlyExit::new(ReturnCode::UserError.as_u64())
20                    .with_message(message_string))
21            }
22            Err(_) => Err(early_exit_vm_error("error message utf-8 error")),
23        }
24    }
25
26    pub fn signal_error_from_buffer(
27        &mut self,
28        message_handle: RawHandle,
29    ) -> Result<(), VMHooksEarlyExit> {
30        let bytes = self.context.m_types_lock().mb_get_owned(message_handle);
31        self.signal_error(&bytes)
32    }
33}