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