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