nostr_sdk/client/
error.rs

1// Copyright (c) 2022-2023 Yuki Kishimoto
2// Copyright (c) 2023-2025 Rust Nostr Developers
3// Distributed under the MIT software license
4
5use std::fmt;
6
7use nostr::prelude::*;
8use nostr::serde_json;
9use nostr_database::prelude::*;
10use nostr_relay_pool::__private::SharedStateError;
11use nostr_relay_pool::prelude::*;
12
13/// Client error
14#[derive(Debug)]
15pub enum Error {
16    /// Relay error
17    Relay(nostr_relay_pool::relay::Error),
18    /// Relay Pool error
19    RelayPool(pool::Error),
20    /// Database error
21    Database(DatabaseError),
22    /// Signer error
23    Signer(SignerError),
24    /// [`EventBuilder`] error
25    EventBuilder(event::builder::Error),
26    /// Json error
27    Json(serde_json::Error),
28    /// Shared state error
29    SharedState(SharedStateError),
30    /// NIP59
31    #[cfg(feature = "nip59")]
32    NIP59(nip59::Error),
33    /// Event not found
34    EventNotFound(EventId),
35    /// Impossible to zap
36    ImpossibleToZap(String),
37    /// Broken down filters for gossip are empty
38    GossipFiltersEmpty,
39    /// Private message (NIP17) relays not found
40    PrivateMsgRelaysNotFound,
41}
42
43impl std::error::Error for Error {}
44
45impl fmt::Display for Error {
46    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
47        match self {
48            Self::Relay(e) => write!(f, "{e}"),
49            Self::RelayPool(e) => write!(f, "{e}"),
50            Self::Database(e) => write!(f, "{e}"),
51            Self::Signer(e) => write!(f, "{e}"),
52            Self::EventBuilder(e) => write!(f, "{e}"),
53            Self::Json(e) => write!(f, "{e}"),
54            Self::SharedState(e) => write!(f, "{e}"),
55            #[cfg(feature = "nip59")]
56            Self::NIP59(e) => write!(f, "{e}"),
57            Self::EventNotFound(id) => {
58                write!(f, "event not found: {id}")
59            }
60            Self::ImpossibleToZap(id) => {
61                write!(f, "impossible to send zap: {id}")
62            }
63            Self::GossipFiltersEmpty => {
64                write!(f, "gossip broken down filters are empty")
65            }
66            Self::PrivateMsgRelaysNotFound => write!(f, "Private message relays not found. The user is not ready to receive private messages."),
67        }
68    }
69}
70
71impl From<nostr_relay_pool::relay::Error> for Error {
72    fn from(e: nostr_relay_pool::relay::Error) -> Self {
73        Self::Relay(e)
74    }
75}
76
77impl From<pool::Error> for Error {
78    fn from(e: pool::Error) -> Self {
79        Self::RelayPool(e)
80    }
81}
82
83impl From<DatabaseError> for Error {
84    fn from(e: DatabaseError) -> Self {
85        Self::Database(e)
86    }
87}
88
89impl From<SignerError> for Error {
90    fn from(e: SignerError) -> Self {
91        Self::Signer(e)
92    }
93}
94
95impl From<event::builder::Error> for Error {
96    fn from(e: event::builder::Error) -> Self {
97        Self::EventBuilder(e)
98    }
99}
100
101impl From<serde_json::Error> for Error {
102    fn from(e: serde_json::Error) -> Self {
103        Self::Json(e)
104    }
105}
106
107impl From<SharedStateError> for Error {
108    fn from(e: SharedStateError) -> Self {
109        Self::SharedState(e)
110    }
111}
112
113#[cfg(feature = "nip59")]
114impl From<nip59::Error> for Error {
115    fn from(e: nip59::Error) -> Self {
116        Self::NIP59(e)
117    }
118}