greentic_types/
distributor.rs1use alloc::string::String;
6
7#[cfg(feature = "schemars")]
8use schemars::JsonSchema;
9#[cfg(feature = "serde")]
10use serde::{Deserialize, Serialize};
11use serde_json::Value;
12
13use crate::TenantCtx;
14
15#[derive(Clone, Debug, PartialEq, Eq, Hash)]
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18#[cfg_attr(feature = "schemars", derive(JsonSchema))]
19pub struct DistributorEnvironmentId(pub String);
20
21impl DistributorEnvironmentId {
22 pub fn as_str(&self) -> &str {
24 &self.0
25 }
26}
27
28impl From<String> for DistributorEnvironmentId {
29 fn from(value: String) -> Self {
30 Self(value)
31 }
32}
33
34impl From<&str> for DistributorEnvironmentId {
35 fn from(value: &str) -> Self {
36 Self(value.to_owned())
37 }
38}
39
40#[derive(Clone, Debug, PartialEq, Eq, Hash)]
42#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
43#[cfg_attr(feature = "schemars", derive(JsonSchema))]
44pub struct ComponentDigest(pub String);
45
46impl ComponentDigest {
47 pub fn as_str(&self) -> &str {
49 &self.0
50 }
51
52 pub fn is_sha256_like(&self) -> bool {
54 const PREFIX: &str = "sha256:";
55 let s = self.0.as_str();
56 if !s.starts_with(PREFIX) {
57 return false;
58 }
59 let rest = &s[PREFIX.len()..];
60 if rest.len() != 64 {
61 return false;
62 }
63 rest.chars()
64 .all(|c| c.is_ascii_hexdigit() && c.is_ascii_lowercase() || c.is_ascii_digit())
65 }
66}
67
68impl From<String> for ComponentDigest {
69 fn from(value: String) -> Self {
70 Self(value)
71 }
72}
73
74impl From<&str> for ComponentDigest {
75 fn from(value: &str) -> Self {
76 Self(value.to_owned())
77 }
78}
79
80#[derive(Clone, Debug, PartialEq, Eq)]
82#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
83#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
84#[cfg_attr(feature = "schemars", derive(JsonSchema))]
85pub enum ComponentStatus {
86 Pending,
88 Ready,
90 Failed {
92 reason: String,
94 },
95}
96
97#[derive(Clone, Debug, PartialEq, Eq)]
99#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
100#[cfg_attr(feature = "schemars", derive(JsonSchema))]
101#[cfg_attr(feature = "serde", serde(tag = "kind", rename_all = "snake_case"))]
102pub enum ArtifactLocation {
103 FilePath {
105 path: String,
107 },
108 OciReference {
110 reference: String,
112 },
113 DistributorInternal {
115 handle: String,
117 },
118}
119
120#[derive(Clone, Debug, PartialEq, Eq)]
122#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
123#[cfg_attr(feature = "schemars", derive(JsonSchema))]
124pub struct SignatureSummary {
125 pub verified: bool,
127 pub signer: String,
129 pub extra: Value,
131}
132
133#[derive(Clone, Debug, PartialEq, Eq)]
135#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
136#[cfg_attr(feature = "schemars", derive(JsonSchema))]
137pub struct CacheInfo {
138 pub size_bytes: u64,
140 pub last_used_utc: String,
142 pub last_refreshed_utc: String,
144}
145
146#[derive(Clone, Debug, PartialEq, Eq)]
148#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
149#[cfg_attr(feature = "schemars", derive(JsonSchema))]
150pub struct ResolveComponentRequest {
151 pub tenant: TenantCtx,
153 pub environment_id: DistributorEnvironmentId,
155 pub pack_id: String,
157 pub component_id: String,
159 pub version: String,
161 pub extra: Value,
163}
164
165#[derive(Clone, Debug, PartialEq, Eq)]
167#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
168#[cfg_attr(feature = "schemars", derive(JsonSchema))]
169pub struct ResolveComponentResponse {
170 pub status: ComponentStatus,
172 pub digest: ComponentDigest,
174 pub artifact: ArtifactLocation,
176 pub signature: SignatureSummary,
178 pub cache: CacheInfo,
180}