1cac7dca0Sopenharmony_ci// Copyright (c) 2023 Huawei Device Co., Ltd. 2cac7dca0Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 3cac7dca0Sopenharmony_ci// you may not use this file except in compliance with the License. 4cac7dca0Sopenharmony_ci// You may obtain a copy of the License at 5cac7dca0Sopenharmony_ci// 6cac7dca0Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 7cac7dca0Sopenharmony_ci// 8cac7dca0Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 9cac7dca0Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 10cac7dca0Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11cac7dca0Sopenharmony_ci// See the License for the specific language governing permissions and 12cac7dca0Sopenharmony_ci// limitations under the License. 13cac7dca0Sopenharmony_ci 14cac7dca0Sopenharmony_ci//! Error of sync 15cac7dca0Sopenharmony_ci 16cac7dca0Sopenharmony_ciuse std::error::Error; 17cac7dca0Sopenharmony_ciuse std::fmt::{Debug, Display, Formatter}; 18cac7dca0Sopenharmony_ci 19cac7dca0Sopenharmony_ci/// Error returned by `send` 20cac7dca0Sopenharmony_ci#[derive(Debug, Eq, PartialEq)] 21cac7dca0Sopenharmony_cipub struct SendError<T>(pub T); 22cac7dca0Sopenharmony_ci 23cac7dca0Sopenharmony_ciimpl<T> Display for SendError<T> { 24cac7dca0Sopenharmony_ci fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 25cac7dca0Sopenharmony_ci write!(f, "channel is closed") 26cac7dca0Sopenharmony_ci } 27cac7dca0Sopenharmony_ci} 28cac7dca0Sopenharmony_ci 29cac7dca0Sopenharmony_ciimpl<T: Debug> Error for SendError<T> {} 30cac7dca0Sopenharmony_ci 31cac7dca0Sopenharmony_ci/// Error returned by `recv` 32cac7dca0Sopenharmony_ci#[derive(Debug, Eq, PartialEq)] 33cac7dca0Sopenharmony_cipub struct RecvError; 34cac7dca0Sopenharmony_ci 35cac7dca0Sopenharmony_ciimpl Display for RecvError { 36cac7dca0Sopenharmony_ci fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 37cac7dca0Sopenharmony_ci write!(f, "channel is closed") 38cac7dca0Sopenharmony_ci } 39cac7dca0Sopenharmony_ci} 40cac7dca0Sopenharmony_ci 41cac7dca0Sopenharmony_ciimpl Error for RecvError {} 42cac7dca0Sopenharmony_ci 43cac7dca0Sopenharmony_ci/// Error returned by `try_send`. 44cac7dca0Sopenharmony_ci#[derive(Debug, Eq, PartialEq)] 45cac7dca0Sopenharmony_cipub enum TrySendError<T> { 46cac7dca0Sopenharmony_ci /// The channel is full now. 47cac7dca0Sopenharmony_ci Full(T), 48cac7dca0Sopenharmony_ci /// The receiver of channel was closed or dropped. 49cac7dca0Sopenharmony_ci Closed(T), 50cac7dca0Sopenharmony_ci} 51cac7dca0Sopenharmony_ci 52cac7dca0Sopenharmony_ciimpl<T> Display for TrySendError<T> { 53cac7dca0Sopenharmony_ci fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 54cac7dca0Sopenharmony_ci match self { 55cac7dca0Sopenharmony_ci TrySendError::Full(_) => write!(f, "channel is full"), 56cac7dca0Sopenharmony_ci TrySendError::Closed(_) => write!(f, "channel is closed"), 57cac7dca0Sopenharmony_ci } 58cac7dca0Sopenharmony_ci } 59cac7dca0Sopenharmony_ci} 60cac7dca0Sopenharmony_ci 61cac7dca0Sopenharmony_ciimpl<T: Debug> Error for TrySendError<T> {} 62cac7dca0Sopenharmony_ci 63cac7dca0Sopenharmony_ci/// Error returned by `try_recv`. 64cac7dca0Sopenharmony_ci#[derive(Debug, Eq, PartialEq, Clone)] 65cac7dca0Sopenharmony_cipub enum TryRecvError { 66cac7dca0Sopenharmony_ci /// sender has not sent a value yet. 67cac7dca0Sopenharmony_ci Empty, 68cac7dca0Sopenharmony_ci /// sender was dropped. 69cac7dca0Sopenharmony_ci Closed, 70cac7dca0Sopenharmony_ci} 71cac7dca0Sopenharmony_ci 72cac7dca0Sopenharmony_ciimpl Display for TryRecvError { 73cac7dca0Sopenharmony_ci fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 74cac7dca0Sopenharmony_ci match self { 75cac7dca0Sopenharmony_ci TryRecvError::Empty => write!(f, "channel is empty"), 76cac7dca0Sopenharmony_ci TryRecvError::Closed => write!(f, "channel is closed"), 77cac7dca0Sopenharmony_ci } 78cac7dca0Sopenharmony_ci } 79cac7dca0Sopenharmony_ci} 80cac7dca0Sopenharmony_ci 81cac7dca0Sopenharmony_ciimpl Error for TryRecvError {} 82cac7dca0Sopenharmony_ci 83cac7dca0Sopenharmony_cicfg_time! { 84cac7dca0Sopenharmony_ci 85cac7dca0Sopenharmony_ci /// Error returned by `send_timeout` 86cac7dca0Sopenharmony_ci #[derive(Debug,Eq,PartialEq)] 87cac7dca0Sopenharmony_ci pub enum SendTimeoutError<T> { 88cac7dca0Sopenharmony_ci /// The receiver of channel was closed or dropped. 89cac7dca0Sopenharmony_ci Closed(T), 90cac7dca0Sopenharmony_ci /// Sending timeout. 91cac7dca0Sopenharmony_ci TimeOut(T), 92cac7dca0Sopenharmony_ci } 93cac7dca0Sopenharmony_ci 94cac7dca0Sopenharmony_ci impl<T> Display for SendTimeoutError<T> { 95cac7dca0Sopenharmony_ci fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 96cac7dca0Sopenharmony_ci match self { 97cac7dca0Sopenharmony_ci SendTimeoutError::Closed(_) => write!(f, "channel is closed"), 98cac7dca0Sopenharmony_ci SendTimeoutError::TimeOut(_) => write!(f, "channel sending timeout"), 99cac7dca0Sopenharmony_ci } 100cac7dca0Sopenharmony_ci } 101cac7dca0Sopenharmony_ci } 102cac7dca0Sopenharmony_ci impl<T: Debug> Error for SendTimeoutError<T> {} 103cac7dca0Sopenharmony_ci 104cac7dca0Sopenharmony_ci /// Error returned by `recv_timeout`. 105cac7dca0Sopenharmony_ci #[derive(Debug, Eq, PartialEq)] 106cac7dca0Sopenharmony_ci pub enum RecvTimeoutError { 107cac7dca0Sopenharmony_ci /// sender was dropped. 108cac7dca0Sopenharmony_ci Closed, 109cac7dca0Sopenharmony_ci /// Receiving timeout. 110cac7dca0Sopenharmony_ci Timeout, 111cac7dca0Sopenharmony_ci } 112cac7dca0Sopenharmony_ci 113cac7dca0Sopenharmony_ci impl Display for RecvTimeoutError { 114cac7dca0Sopenharmony_ci fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 115cac7dca0Sopenharmony_ci match self { 116cac7dca0Sopenharmony_ci RecvTimeoutError::Closed => write!(f, "channel is closed"), 117cac7dca0Sopenharmony_ci RecvTimeoutError::Timeout => write!(f, "channel receiving timeout"), 118cac7dca0Sopenharmony_ci } 119cac7dca0Sopenharmony_ci } 120cac7dca0Sopenharmony_ci } 121cac7dca0Sopenharmony_ci 122cac7dca0Sopenharmony_ci impl Error for RecvTimeoutError {} 123cac7dca0Sopenharmony_ci} 124cac7dca0Sopenharmony_ci 125cac7dca0Sopenharmony_ci#[cfg(test)] 126cac7dca0Sopenharmony_ci#[cfg(feature = "time")] 127cac7dca0Sopenharmony_cimod test { 128cac7dca0Sopenharmony_ci use crate::sync::error::{RecvError, RecvTimeoutError, TryRecvError}; 129cac7dca0Sopenharmony_ci 130cac7dca0Sopenharmony_ci /// UT test cases for Error. 131cac7dca0Sopenharmony_ci /// 132cac7dca0Sopenharmony_ci /// # Brief 133cac7dca0Sopenharmony_ci /// 1. create two JoinHandle 134cac7dca0Sopenharmony_ci /// 2. check the correctness of the JoinHandle for completion 135cac7dca0Sopenharmony_ci #[test] 136cac7dca0Sopenharmony_ci fn ut_test_sync_error_display() { 137cac7dca0Sopenharmony_ci let recv_err = RecvError; 138cac7dca0Sopenharmony_ci assert_eq!(format!("{recv_err}"), "channel is closed"); 139cac7dca0Sopenharmony_ci 140cac7dca0Sopenharmony_ci let try_recv_err1 = TryRecvError::Empty; 141cac7dca0Sopenharmony_ci assert_eq!(format!("{try_recv_err1}"), "channel is empty"); 142cac7dca0Sopenharmony_ci let try_recv_err2 = TryRecvError::Closed; 143cac7dca0Sopenharmony_ci assert_eq!(format!("{try_recv_err2}"), "channel is closed"); 144cac7dca0Sopenharmony_ci 145cac7dca0Sopenharmony_ci let try_timeout1 = RecvTimeoutError::Closed; 146cac7dca0Sopenharmony_ci assert_eq!(format!("{try_timeout1}"), "channel is closed"); 147cac7dca0Sopenharmony_ci let try_timeout2 = RecvTimeoutError::Timeout; 148cac7dca0Sopenharmony_ci assert_eq!(format!("{try_timeout2}"), "channel receiving timeout"); 149cac7dca0Sopenharmony_ci } 150cac7dca0Sopenharmony_ci} 151