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    /// Update service does not provide `HttpPushUri`
41    #[cfg(feature = "update-service-deprecated")]
42    UpdateServiceHttpPushUriNotAvailable,
43    /// Task service does not provide a Tasks collection.
44    #[cfg(feature = "task-service")]
45    TaskServiceTasksUnavailable,
46    /// Task location does not point at this TaskService Tasks collection.
47    #[cfg(feature = "task-service")]
48    TaskLocationNotInTaskService {
49        /// Task location.
50        task_location: nv_redfish_core::ODataId,
51        /// Expected TaskService Tasks collection path.
52        task_collection: nv_redfish_core::ODataId,
53    },
54    /// Metric definitions are not available for telemetry service
55    #[cfg(feature = "telemetry-service")]
56    MetricDefinitionsNotAvailable,
57    /// Metric report definitions are not available for telemetry service
58    #[cfg(feature = "telemetry-service")]
59    MetricReportDefinitionsNotAvailable,
60    /// JSON parse error.
61    Json(JsonError),
62}
63
64impl<B: Bmc> Display for Error<B> {
65    #[allow(clippy::too_many_lines)]
66    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
67        match self {
68            Self::Bmc(err) => write!(f, "BMC error: {err}"),
69            Self::Json(err) => write!(f, "JSON error: {err}"),
70            #[cfg(feature = "accounts")]
71            Self::AccountSlotNotAvailable => {
72                write!(f, "Free account slot is not found")
73            }
74            Self::ActionNotAvailable => {
75                write!(f, "Action is not available for this resource")
76            }
77            #[cfg(feature = "event-service")]
78            Self::EventServiceServerSentEventUriNotAvailable => {
79                write!(f, "Event service does not provide ServerSentEventUri")
80            }
81            #[cfg(feature = "update-service")]
82            Self::UpdateServiceMultipartHttpPushUriNotAvailable => {
83                write!(f, "Update service does not provide MultipartHttpPushUri")
84            }
85            #[cfg(feature = "update-service-deprecated")]
86            Self::UpdateServiceHttpPushUriNotAvailable => {
87                write!(f, "Update service does not provide HttpPushUri")
88            }
89            #[cfg(feature = "task-service")]
90            Self::TaskServiceTasksUnavailable => {
91                write!(f, "Task service does not provide Tasks collection")
92            }
93            #[cfg(feature = "task-service")]
94            Self::TaskLocationNotInTaskService {
95                task_location,
96                task_collection,
97            } => write!(
98                f,
99                "Task location {task_location} is not in TaskService Tasks collection {task_collection}"
100            ),
101            #[cfg(feature = "telemetry-service")]
102            Self::MetricDefinitionsNotAvailable => {
103                write!(f, "Metric definitions are not available")
104            }
105            #[cfg(feature = "telemetry-service")]
106            Self::MetricReportDefinitionsNotAvailable => {
107                write!(f, "Metric report definitions are not available")
108            }
109        }
110    }
111}
112
113impl<B: Bmc> Debug for Error<B> {
114    fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
115        Display::fmt(self, f)
116    }
117}
118
119impl<B: Bmc> StdError for Error<B> {}