1a34a8711Sopenharmony_ci// Copyright (C) 2024 Huawei Device Co., Ltd. 2a34a8711Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 3a34a8711Sopenharmony_ci// you may not use this file except in compliance with the License. 4a34a8711Sopenharmony_ci// You may obtain a copy of the License at 5a34a8711Sopenharmony_ci// 6a34a8711Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 7a34a8711Sopenharmony_ci// 8a34a8711Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 9a34a8711Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 10a34a8711Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11a34a8711Sopenharmony_ci// See the License for the specific language governing permissions and 12a34a8711Sopenharmony_ci// limitations under the License. 13a34a8711Sopenharmony_ci 14a34a8711Sopenharmony_ciuse std::error::Error; 15a34a8711Sopenharmony_ciuse std::ffi::{c_char, CString}; 16a34a8711Sopenharmony_ciuse std::fmt; 17a34a8711Sopenharmony_ci 18a34a8711Sopenharmony_ci/// IPC specific Result, error is i32 type 19a34a8711Sopenharmony_cipub type IpcResult<T> = std::result::Result<T, IpcStatusCode>; 20a34a8711Sopenharmony_ci 21a34a8711Sopenharmony_ci/// usage: 22a34a8711Sopenharmony_ci/// status_result::<()>(result, ()) 23a34a8711Sopenharmony_ci/// or 24a34a8711Sopenharmony_ci/// status_result::<MsgParcel>(result, reply) 25a34a8711Sopenharmony_cipub fn status_result<T>(code: i32, val: T) -> IpcResult<T> { 26a34a8711Sopenharmony_ci debug!("rust status code: {}", code); 27a34a8711Sopenharmony_ci match parse_status_code(code) { 28a34a8711Sopenharmony_ci IpcStatusCode::Ok => Ok(val), 29a34a8711Sopenharmony_ci e => Err(e), 30a34a8711Sopenharmony_ci } 31a34a8711Sopenharmony_ci} 32a34a8711Sopenharmony_ci 33a34a8711Sopenharmony_ci/// Parse status code 34a34a8711Sopenharmony_cipub fn parse_status_code(code: i32) -> IpcStatusCode { 35a34a8711Sopenharmony_ci match code { 36a34a8711Sopenharmony_ci e if e == IpcStatusCode::Ok as i32 => IpcStatusCode::Ok, 37a34a8711Sopenharmony_ci e if e == IpcStatusCode::Failed as i32 => IpcStatusCode::Failed, 38a34a8711Sopenharmony_ci e if e == IpcStatusCode::Einval as i32 => IpcStatusCode::Einval, 39a34a8711Sopenharmony_ci e if e == IpcStatusCode::ErrNullObject as i32 => IpcStatusCode::ErrNullObject, 40a34a8711Sopenharmony_ci e if e == IpcStatusCode::ErrDeadObject as i32 => IpcStatusCode::ErrDeadObject, 41a34a8711Sopenharmony_ci e if e == IpcStatusCode::InvalidValue as i32 => IpcStatusCode::InvalidValue, 42a34a8711Sopenharmony_ci _ => IpcStatusCode::Unknow, 43a34a8711Sopenharmony_ci } 44a34a8711Sopenharmony_ci} 45a34a8711Sopenharmony_ci 46a34a8711Sopenharmony_ci/// IPC unified status code 47a34a8711Sopenharmony_ci#[derive(Hash, Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Debug)] 48a34a8711Sopenharmony_ci#[non_exhaustive] 49a34a8711Sopenharmony_cipub enum IpcStatusCode { 50a34a8711Sopenharmony_ci /// success 51a34a8711Sopenharmony_ci Ok = 1, 52a34a8711Sopenharmony_ci /// failed 53a34a8711Sopenharmony_ci Failed = -1, 54a34a8711Sopenharmony_ci /// RemoteObj Err Code 55a34a8711Sopenharmony_ci /// Invalide Params 56a34a8711Sopenharmony_ci Einval = 22, 57a34a8711Sopenharmony_ci /// Object is null 58a34a8711Sopenharmony_ci ErrNullObject = 7, 59a34a8711Sopenharmony_ci /// The object has died 60a34a8711Sopenharmony_ci ErrDeadObject = -32, 61a34a8711Sopenharmony_ci /// invail value 62a34a8711Sopenharmony_ci InvalidValue = 0, 63a34a8711Sopenharmony_ci /// unknow value 64a34a8711Sopenharmony_ci Unknow = 99999, 65a34a8711Sopenharmony_ci} 66a34a8711Sopenharmony_ci 67a34a8711Sopenharmony_ciimpl Error for IpcStatusCode {} 68a34a8711Sopenharmony_ci 69a34a8711Sopenharmony_ci/// # Safety 70a34a8711Sopenharmony_ci/// 71a34a8711Sopenharmony_ci/// IpcStatusCode is an enumeration type that can exist in multiple threads. 72a34a8711Sopenharmony_ciunsafe impl Send for IpcStatusCode {} 73a34a8711Sopenharmony_ci 74a34a8711Sopenharmony_ciimpl fmt::Display for IpcStatusCode { 75a34a8711Sopenharmony_ci fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 76a34a8711Sopenharmony_ci match *self { 77a34a8711Sopenharmony_ci IpcStatusCode::Ok => write!(f, "Call Ok"), 78a34a8711Sopenharmony_ci IpcStatusCode::Failed => write!(f, "Call Failed"), 79a34a8711Sopenharmony_ci IpcStatusCode::Einval => write!(f, "Invalid Params"), 80a34a8711Sopenharmony_ci IpcStatusCode::ErrNullObject => write!(f, "Null Obj"), 81a34a8711Sopenharmony_ci IpcStatusCode::ErrDeadObject => write!(f, "Dead Obj"), 82a34a8711Sopenharmony_ci IpcStatusCode::InvalidValue => write!(f, "Invalid Value"), 83a34a8711Sopenharmony_ci _ => write!(f, "Unknow Error"), 84a34a8711Sopenharmony_ci } 85a34a8711Sopenharmony_ci } 86a34a8711Sopenharmony_ci} 87