rib/registry/
component_dependency_key.rs

1// Copyright 2024-2025 Golem Cloud
2//
3// Licensed under the Golem Source License v1.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://license.golem.cloud/LICENSE
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use std::fmt::{Display, Formatter};
16use uuid::Uuid;
17
18#[derive(Debug, Hash, PartialEq, Eq, Clone, Ord, PartialOrd)]
19pub struct ComponentDependencyKey {
20    pub component_name: String,
21    pub component_id: Uuid,
22    pub component_version: u64,
23    pub root_package_name: Option<String>,
24    pub root_package_version: Option<String>,
25}
26
27impl bincode::Encode for ComponentDependencyKey {
28    fn encode<E: bincode::enc::Encoder>(
29        &self,
30        encoder: &mut E,
31    ) -> Result<(), bincode::error::EncodeError> {
32        use bincode::enc::write::Writer;
33
34        encoder.writer().write(self.component_name.as_bytes())?;
35        self.component_id.as_bytes().encode(encoder)?;
36        self.component_version.encode(encoder)?;
37        Option::<String>::encode(&self.root_package_name, encoder)?;
38        Option::<String>::encode(&self.root_package_version, encoder)?;
39
40        Ok(())
41    }
42}
43
44impl<Context> bincode::Decode<Context> for ComponentDependencyKey {
45    fn decode<D: bincode::de::Decoder>(
46        decoder: &mut D,
47    ) -> Result<Self, bincode::error::DecodeError> {
48        use bincode::de::read::Reader;
49
50        let component_name = String::decode(decoder)?;
51        let mut bytes = [0u8; 16];
52        decoder.reader().read(&mut bytes)?;
53        let component_id = Uuid::from_bytes(bytes);
54        let component_version = u64::decode(decoder)?;
55        let root_package_name = Option::<String>::decode(decoder)?;
56        let root_package_version = Option::<String>::decode(decoder)?;
57
58        Ok(ComponentDependencyKey {
59            component_name,
60            component_version,
61            component_id,
62            root_package_name,
63            root_package_version,
64        })
65    }
66}
67
68impl<'de, Context> bincode::BorrowDecode<'de, Context> for ComponentDependencyKey {
69    fn borrow_decode<D: bincode::de::BorrowDecoder<'de, Context = Context>>(
70        decoder: &mut D,
71    ) -> Result<Self, bincode::error::DecodeError> {
72        use bincode::de::read::Reader;
73
74        let component_name = String::borrow_decode(decoder)?;
75        let mut bytes = [0u8; 16];
76        decoder.reader().read(&mut bytes)?;
77        let component_id = Uuid::from_bytes(bytes);
78        let component_version = u64::borrow_decode(decoder)?;
79        let root_package_name = Option::<String>::borrow_decode(decoder)?;
80        let root_package_version = Option::<String>::borrow_decode(decoder)?;
81
82        Ok(ComponentDependencyKey {
83            component_name,
84            component_id,
85            component_version,
86            root_package_name,
87            root_package_version,
88        })
89    }
90}
91
92impl Display for ComponentDependencyKey {
93    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
94        write!(
95            f,
96            "Component: {}, ID: {}, Root Package: {}@{}",
97            self.component_name,
98            self.component_id,
99            self.root_package_name.as_deref().unwrap_or("unknown"),
100            self.root_package_version.as_deref().unwrap_or("unknown")
101        )
102    }
103}