// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

#![allow(clippy::nonstandard_macro_braces)]
#![allow(clippy::enum_variant_names)]

use teaclave_types::{ECallStatus, SgxStatus};
use thiserror::Error;

#[cfg(feature = "app")]
#[derive(Error, Debug)]
pub enum TeeBinderError {
    #[error("failed to invoke IPC")]
    IpcError(IpcError),
    #[error("found SGX error: {0}")]
    SgxError(SgxStatus),
}

#[derive(Error, Debug)]
pub enum IpcError {
    #[error("found SGX error: {0}")]
    SgxError(SgxStatus),
    #[error("ECall returns error code: {0}")]
    ECallError(ECallStatus),
    #[error("cannot serialize or deserialize IPC messages")]
    SerdeError,
}

impl From<serde_json::error::Error> for IpcError {
    fn from(_: serde_json::error::Error) -> Self {
        IpcError::SerdeError
    }
}
