use std::collections::BTreeMap; use crate::{ model::{RpcError, RpcValue}, xmlrpc::{XmlRpcMember, XmlRpcValue}, }; /// Converts an RPC error into the JSON-RPC error-object shape used by multicall. pub(super) fn rpc_error_value(error: RpcError) -> RpcValue { RpcValue::Object(BTreeMap::from([ ( "code".to_owned(), RpcValue::Number(i64::from(error.code as i32)), ), ("message".to_owned(), RpcValue::String(error.message)), ])) } /// Converts an RPC error into the XML-RPC fault-value shape used by multicall. pub(super) fn xmlrpc_error_value(error: RpcError) -> XmlRpcValue { xmlrpc_fault_value(xmlrpc_fault_from_error(error)) } /// Serializes an XML-RPC fault struct into a value payload. pub(super) fn xmlrpc_fault_value(fault: crate::xmlrpc::XmlRpcFault) -> XmlRpcValue { XmlRpcValue::Struct(vec![ XmlRpcMember { name: "faultCode".to_owned(), value: XmlRpcValue::Int(fault.code), }, XmlRpcMember { name: "faultString".to_owned(), value: XmlRpcValue::String(fault.message), }, ]) } /// Wraps an RPC error in the XML-RPC fault envelope expected by aria2 clients. pub(super) fn xmlrpc_fault_from_error(error: RpcError) -> crate::xmlrpc::XmlRpcFault { let message = error.message.clone(); crate::xmlrpc::XmlRpcFault { code: 1, message, error: Some(error), } }