Skip to main content

nv_redfish/
hardware_id.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 std::marker::PhantomData;
17use tagged_types::TaggedType;
18
19/// Type for hardware manufacturers.
20pub type Manufacturer<T, Tag> = TaggedType<T, ManufacturerTag<Tag>>;
21#[doc(hidden)]
22pub struct ManufacturerTag<Tag> {
23    _marker: PhantomData<Tag>,
24}
25impl<T> tagged_types::ImplementClone for ManufacturerTag<T> {}
26impl<T> tagged_types::ImplementCopy for ManufacturerTag<T> {}
27impl<T> tagged_types::ImplementHash for ManufacturerTag<T> {}
28impl<T> tagged_types::ImplementPartialEq for ManufacturerTag<T> {}
29impl<T> tagged_types::ImplementEq for ManufacturerTag<T> {}
30impl<T> tagged_types::ImplementPartialOrd for ManufacturerTag<T> {}
31impl<T> tagged_types::TransparentDebug for ManufacturerTag<T> {}
32impl<T> tagged_types::TransparentDisplay for ManufacturerTag<T> {}
33impl<T> tagged_types::TransparentSerialize for ManufacturerTag<T> {}
34impl<T> tagged_types::TransparentDeserialize for ManufacturerTag<T> {}
35impl<T> tagged_types::InnerAccess for ManufacturerTag<T> {}
36impl<T> tagged_types::Cloned for ManufacturerTag<T> {}
37impl<T> tagged_types::AsRef for ManufacturerTag<T> {}
38
39/// Type for hardware model.
40pub type Model<T, Tag> = TaggedType<T, ModelTag<Tag>>;
41#[doc(hidden)]
42pub struct ModelTag<Tag> {
43    _marker: PhantomData<Tag>,
44}
45impl<T> tagged_types::ImplementClone for ModelTag<T> {}
46impl<T> tagged_types::ImplementCopy for ModelTag<T> {}
47impl<T> tagged_types::ImplementHash for ModelTag<T> {}
48impl<T> tagged_types::ImplementPartialEq for ModelTag<T> {}
49impl<T> tagged_types::ImplementEq for ModelTag<T> {}
50impl<T> tagged_types::ImplementPartialOrd for ModelTag<T> {}
51impl<T> tagged_types::TransparentDebug for ModelTag<T> {}
52impl<T> tagged_types::TransparentDisplay for ModelTag<T> {}
53impl<T> tagged_types::TransparentSerialize for ModelTag<T> {}
54impl<T> tagged_types::TransparentDeserialize for ModelTag<T> {}
55impl<T> tagged_types::InnerAccess for ModelTag<T> {}
56impl<T> tagged_types::Cloned for ModelTag<T> {}
57impl<T> tagged_types::AsRef for ModelTag<T> {}
58
59/// Type for hardware model.
60pub type PartNumber<T, Tag> = TaggedType<T, PartNumberTag<Tag>>;
61#[doc(hidden)]
62pub struct PartNumberTag<Tag> {
63    _marker: PhantomData<Tag>,
64}
65impl<T> tagged_types::ImplementClone for PartNumberTag<T> {}
66impl<T> tagged_types::ImplementCopy for PartNumberTag<T> {}
67impl<T> tagged_types::ImplementHash for PartNumberTag<T> {}
68impl<T> tagged_types::ImplementPartialEq for PartNumberTag<T> {}
69impl<T> tagged_types::ImplementEq for PartNumberTag<T> {}
70impl<T> tagged_types::ImplementPartialOrd for PartNumberTag<T> {}
71impl<T> tagged_types::TransparentDebug for PartNumberTag<T> {}
72impl<T> tagged_types::TransparentDisplay for PartNumberTag<T> {}
73impl<T> tagged_types::TransparentSerialize for PartNumberTag<T> {}
74impl<T> tagged_types::TransparentDeserialize for PartNumberTag<T> {}
75impl<T> tagged_types::InnerAccess for PartNumberTag<T> {}
76impl<T> tagged_types::Cloned for PartNumberTag<T> {}
77impl<T> tagged_types::AsRef for PartNumberTag<T> {}
78
79/// Type for hardware serial numbers.
80pub type SerialNumber<T, Tag> = TaggedType<T, SerialNumberTag<Tag>>;
81#[doc(hidden)]
82pub struct SerialNumberTag<Tag> {
83    _marker: PhantomData<Tag>,
84}
85impl<T> tagged_types::ImplementClone for SerialNumberTag<T> {}
86impl<T> tagged_types::ImplementCopy for SerialNumberTag<T> {}
87impl<T> tagged_types::ImplementHash for SerialNumberTag<T> {}
88impl<T> tagged_types::ImplementPartialEq for SerialNumberTag<T> {}
89impl<T> tagged_types::ImplementEq for SerialNumberTag<T> {}
90impl<T> tagged_types::ImplementPartialOrd for SerialNumberTag<T> {}
91impl<T> tagged_types::TransparentDebug for SerialNumberTag<T> {}
92impl<T> tagged_types::TransparentDisplay for SerialNumberTag<T> {}
93impl<T> tagged_types::TransparentSerialize for SerialNumberTag<T> {}
94impl<T> tagged_types::TransparentDeserialize for SerialNumberTag<T> {}
95impl<T> tagged_types::InnerAccess for SerialNumberTag<T> {}
96impl<T> tagged_types::Cloned for SerialNumberTag<T> {}
97impl<T> tagged_types::AsRef for SerialNumberTag<T> {}
98
99/// Hardware ID is Manufacturer + Model + Part Number + Serial Number.
100/// It is tagged by the type of related redfish module.
101#[derive(Clone)]
102pub struct HardwareId<Tag> {
103    /// Manufacturer of the hardware.
104    pub manufacturer: Option<Manufacturer<String, Tag>>,
105    /// Model of the hardware.
106    pub model: Option<Model<String, Tag>>,
107    /// Part number assigned by the manufacturer
108    pub part_number: Option<PartNumber<String, Tag>>,
109    /// Serial number assigned by the manufacturer
110    pub serial_number: Option<SerialNumber<String, Tag>>,
111}
112
113impl<Tag> HardwareId<Tag> {
114    /// Transform to references represnetation of `HardwareId`.
115    pub fn as_ref(&self) -> HardwareIdRef<'_, Tag> {
116        HardwareIdRef {
117            manufacturer: self.manufacturer.as_ref().map(TaggedType::as_ref),
118            model: self.model.as_ref().map(TaggedType::as_ref),
119            part_number: self.part_number.as_ref().map(TaggedType::as_ref),
120            serial_number: self.serial_number.as_ref().map(TaggedType::as_ref),
121        }
122    }
123}
124
125/// Reference to hardware IDs.
126#[derive(Clone, Copy)]
127pub struct HardwareIdRef<'a, Tag> {
128    /// Manufacturer of the hardware.
129    pub manufacturer: Option<Manufacturer<&'a String, Tag>>,
130    /// Model of the hardware.
131    pub model: Option<Model<&'a String, Tag>>,
132    /// Part number assigned by the manufacturer
133    pub part_number: Option<PartNumber<&'a String, Tag>>,
134    /// Serial number assigned by the manufacturer
135    pub serial_number: Option<SerialNumber<&'a String, Tag>>,
136}
137
138impl<Tag> HardwareIdRef<'_, Tag> {
139    /// Transform to owned `HardwareId`.
140    pub fn cloned(&self) -> HardwareId<Tag> {
141        HardwareId {
142            manufacturer: self.manufacturer.map(TaggedType::cloned),
143            model: self.model.map(TaggedType::cloned),
144            part_number: self.part_number.map(TaggedType::cloned),
145            serial_number: self.serial_number.map(TaggedType::cloned),
146        }
147    }
148}