Skip to main content

nv_redfish/
error.rs

1// SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2// SPDX-License-Identifier: Apache-2.0
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16use nv_redfish_core::Bmc;
17use serde_json::Error as JsonError;
18use std::error::Error as StdError;
19use std::fmt::Debug;
20use std::fmt::Display;
21use std::fmt::Formatter;
22use std::fmt::Result as FmtResult;
23
24/// Redfish Errors.
25pub enum Error<B: Bmc> {
26    /// Errors generated by BMC access.
27    Bmc(B::Error),
28    /// No available account slot found. This error happens for
29    /// `slot_defined_user_accounts` feature.
30    #[cfg(feature = "accounts")]
31    AccountSlotNotAvailable,
32    /// Action not available for this resource
33    ActionNotAvailable,
34    /// Event service does not provide `ServerSentEventUri`
35    #[cfg(feature = "event-service")]
36    EventServiceServerSentEventUriNotAvailable,
37    /// Update service does not provide `MultipartHttpPushUri`
38    #[cfg(feature = "update-service")]
39    UpdateServiceMultipartHttpPushUriNotAvailable,
40    /// Metric definitions are not available for telemetry service
41    #[cfg(feature = "telemetry-service")]
42    MetricDefinitionsNotAvailable,
43    /// Metric report definitions are not available for telemetry service
44    #[cfg(feature = "telemetry-service")]
45    MetricReportDefinitionsNotAvailable,
46    /// JSON parse error.
47    Json(JsonError),
48}
49
50impl<B: Bmc> Display for Error<B> {
51    #[allow(clippy::too_many_lines)]
52    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
53        match self {
54            Self::Bmc(err) => write!(f, "BMC error: {err}"),
55            Self::Json(err) => write!(f, "JSON error: {err}"),
56            #[cfg(feature = "accounts")]
57            Self::AccountSlotNotAvailable => {
58                write!(f, "Free account slot is not found")
59            }
60            Self::ActionNotAvailable => {
61                write!(f, "Action is not available for this resource")
62            }
63            #[cfg(feature = "event-service")]
64            Self::EventServiceServerSentEventUriNotAvailable => {
65                write!(f, "Event service does not provide ServerSentEventUri")
66            }
67            #[cfg(feature = "update-service")]
68            Self::UpdateServiceMultipartHttpPushUriNotAvailable => {
69                write!(f, "Update service does not provide MultipartHttpPushUri")
70            }
71            #[cfg(feature = "telemetry-service")]
72            Self::MetricDefinitionsNotAvailable => {
73                write!(f, "Metric definitions are not available")
74            }
75            #[cfg(feature = "telemetry-service")]
76            Self::MetricReportDefinitionsNotAvailable => {
77                write!(f, "Metric report definitions are not available")
78            }
79        }
80    }
81}
82
83impl<B: Bmc> Debug for Error<B> {
84    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
85        Display::fmt(self, f)
86    }
87}
88
89impl<B: Bmc> StdError for Error<B> {}