Skip to main content

unitycatalog_common/models/resources/
mod.rs

1pub use super::_gen::ObjectLabel;
2pub use olai_store::{EMPTY_RESOURCE_NAME, ResourceName, ResourceRef};
3
4// Re-export the resource_name! macro from name.rs (which wraps the derive macro)
5pub use name::resource_name;
6
7mod name;
8
9/// Resource that a policy can authorize.
10#[derive(Debug, Clone, PartialEq, Eq, Hash)]
11pub enum ResourceIdent {
12    Agent(ResourceRef),
13    AgentSkill(ResourceRef),
14    Share(ResourceRef),
15    Credential(ResourceRef),
16    ExternalLocation(ResourceRef),
17    Catalog(ResourceRef),
18    Schema(ResourceRef),
19    Table(ResourceRef),
20    Recipient(ResourceRef),
21    Provider(ResourceRef),
22    Column(ResourceRef),
23    Volume(ResourceRef),
24    Function(ResourceRef),
25    TagPolicy(ResourceRef),
26    StagingTable(ResourceRef),
27    PolicyInfo(ResourceRef),
28    RegisteredModel(ResourceRef),
29    ModelVersion(ResourceRef),
30}
31
32impl ResourceIdent {
33    pub fn label(&self) -> &ObjectLabel {
34        self.as_ref()
35    }
36
37    pub fn reference(&self) -> &ResourceRef {
38        self.as_ref()
39    }
40
41    pub fn agent(name: impl Into<ResourceRef>) -> Self {
42        Self::Agent(name.into())
43    }
44
45    pub fn agent_skill(name: impl Into<ResourceRef>) -> Self {
46        Self::AgentSkill(name.into())
47    }
48
49    pub fn share(name: impl Into<ResourceRef>) -> Self {
50        Self::Share(name.into())
51    }
52
53    pub fn credential(name: impl Into<ResourceRef>) -> Self {
54        Self::Credential(name.into())
55    }
56
57    pub fn catalog(name: impl Into<ResourceRef>) -> Self {
58        Self::Catalog(name.into())
59    }
60
61    pub fn schema(name: impl Into<ResourceRef>) -> Self {
62        Self::Schema(name.into())
63    }
64
65    pub fn table(name: impl Into<ResourceRef>) -> Self {
66        Self::Table(name.into())
67    }
68
69    pub fn column(name: impl Into<ResourceRef>) -> Self {
70        Self::Column(name.into())
71    }
72
73    pub fn external_location(name: impl Into<ResourceRef>) -> Self {
74        Self::ExternalLocation(name.into())
75    }
76
77    pub fn recipient(name: impl Into<ResourceRef>) -> Self {
78        Self::Recipient(name.into())
79    }
80
81    pub fn provider(name: impl Into<ResourceRef>) -> Self {
82        Self::Provider(name.into())
83    }
84
85    pub fn volume(name: impl Into<ResourceRef>) -> Self {
86        Self::Volume(name.into())
87    }
88
89    pub fn function(name: impl Into<ResourceRef>) -> Self {
90        Self::Function(name.into())
91    }
92
93    pub fn tag_policy(name: impl Into<ResourceRef>) -> Self {
94        Self::TagPolicy(name.into())
95    }
96
97    pub fn staging_table(name: impl Into<ResourceRef>) -> Self {
98        Self::StagingTable(name.into())
99    }
100
101    pub fn policy_info(name: impl Into<ResourceRef>) -> Self {
102        Self::PolicyInfo(name.into())
103    }
104
105    pub fn registered_model(name: impl Into<ResourceRef>) -> Self {
106        Self::RegisteredModel(name.into())
107    }
108
109    pub fn model_version(name: impl Into<ResourceRef>) -> Self {
110        Self::ModelVersion(name.into())
111    }
112}
113
114impl std::fmt::Display for ResourceIdent {
115    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
116        match self {
117            ResourceIdent::Agent(r) => write!(f, "agent:{}", r),
118            ResourceIdent::AgentSkill(r) => write!(f, "agent_skill:{}", r),
119            ResourceIdent::Share(r) => write!(f, "share:{}", r),
120            ResourceIdent::Credential(r) => write!(f, "credential:{}", r),
121            ResourceIdent::ExternalLocation(r) => write!(f, "external_location:{}", r),
122            ResourceIdent::Catalog(r) => write!(f, "catalog:{}", r),
123            ResourceIdent::Schema(r) => write!(f, "schema:{}", r),
124            ResourceIdent::Table(r) => write!(f, "table:{}", r),
125            ResourceIdent::Recipient(r) => write!(f, "recipient:{}", r),
126            ResourceIdent::Provider(r) => write!(f, "provider:{}", r),
127            ResourceIdent::Column(r) => write!(f, "column:{}", r),
128            ResourceIdent::Volume(r) => write!(f, "volume:{}", r),
129            ResourceIdent::Function(r) => write!(f, "function:{}", r),
130            ResourceIdent::TagPolicy(r) => write!(f, "tag_policy:{}", r),
131            ResourceIdent::StagingTable(r) => write!(f, "staging_table:{}", r),
132            ResourceIdent::PolicyInfo(r) => write!(f, "policy_info:{}", r),
133            ResourceIdent::RegisteredModel(r) => write!(f, "registered_model:{}", r),
134            ResourceIdent::ModelVersion(r) => write!(f, "model_version:{}", r),
135        }
136    }
137}
138
139impl AsRef<ResourceRef> for ResourceIdent {
140    fn as_ref(&self) -> &ResourceRef {
141        match self {
142            ResourceIdent::Agent(r) => r,
143            ResourceIdent::AgentSkill(r) => r,
144            ResourceIdent::Share(r) => r,
145            ResourceIdent::Credential(r) => r,
146            ResourceIdent::ExternalLocation(r) => r,
147            ResourceIdent::Catalog(r) => r,
148            ResourceIdent::Schema(r) => r,
149            ResourceIdent::Table(r) => r,
150            ResourceIdent::Recipient(r) => r,
151            ResourceIdent::Provider(r) => r,
152            ResourceIdent::Column(r) => r,
153            ResourceIdent::Volume(r) => r,
154            ResourceIdent::Function(r) => r,
155            ResourceIdent::TagPolicy(r) => r,
156            ResourceIdent::StagingTable(r) => r,
157            ResourceIdent::PolicyInfo(r) => r,
158            ResourceIdent::RegisteredModel(r) => r,
159            ResourceIdent::ModelVersion(r) => r,
160        }
161    }
162}
163
164impl AsRef<ObjectLabel> for ResourceIdent {
165    fn as_ref(&self) -> &ObjectLabel {
166        match self {
167            ResourceIdent::Agent(_) => &ObjectLabel::Agent,
168            ResourceIdent::AgentSkill(_) => &ObjectLabel::AgentSkill,
169            ResourceIdent::Share(_) => &ObjectLabel::Share,
170            ResourceIdent::Credential(_) => &ObjectLabel::Credential,
171            ResourceIdent::ExternalLocation(_) => &ObjectLabel::ExternalLocation,
172            ResourceIdent::Catalog(_) => &ObjectLabel::Catalog,
173            ResourceIdent::Schema(_) => &ObjectLabel::Schema,
174            ResourceIdent::Table(_) => &ObjectLabel::Table,
175            ResourceIdent::Recipient(_) => &ObjectLabel::Recipient,
176            ResourceIdent::Provider(_) => &ObjectLabel::Provider,
177            ResourceIdent::Column(_) => &ObjectLabel::Column,
178            ResourceIdent::Volume(_) => &ObjectLabel::Volume,
179            ResourceIdent::Function(_) => &ObjectLabel::Function,
180            ResourceIdent::TagPolicy(_) => &ObjectLabel::TagPolicy,
181            ResourceIdent::StagingTable(_) => &ObjectLabel::StagingTable,
182            ResourceIdent::PolicyInfo(_) => &ObjectLabel::PolicyInfo,
183            ResourceIdent::RegisteredModel(_) => &ObjectLabel::RegisteredModel,
184            ResourceIdent::ModelVersion(_) => &ObjectLabel::ModelVersion,
185        }
186    }
187}
188
189impl From<ResourceIdent> for ResourceRef {
190    fn from(ident: ResourceIdent) -> Self {
191        match ident {
192            ResourceIdent::Agent(r) => r,
193            ResourceIdent::AgentSkill(r) => r,
194            ResourceIdent::Share(r) => r,
195            ResourceIdent::Credential(r) => r,
196            ResourceIdent::ExternalLocation(r) => r,
197            ResourceIdent::Catalog(r) => r,
198            ResourceIdent::Schema(r) => r,
199            ResourceIdent::Table(r) => r,
200            ResourceIdent::Recipient(r) => r,
201            ResourceIdent::Provider(r) => r,
202            ResourceIdent::Column(r) => r,
203            ResourceIdent::Volume(r) => r,
204            ResourceIdent::Function(r) => r,
205            ResourceIdent::TagPolicy(r) => r,
206            ResourceIdent::StagingTable(r) => r,
207            ResourceIdent::PolicyInfo(r) => r,
208            ResourceIdent::RegisteredModel(r) => r,
209            ResourceIdent::ModelVersion(r) => r,
210        }
211    }
212}
213
214impl From<&ResourceIdent> for ResourceRef {
215    fn from(ident: &ResourceIdent) -> Self {
216        (ident as &dyn AsRef<ResourceRef>).as_ref().clone()
217    }
218}
219
220impl From<&ResourceIdent> for ObjectLabel {
221    fn from(ident: &ResourceIdent) -> Self {
222        *(ident as &dyn AsRef<ObjectLabel>).as_ref()
223    }
224}
225
226impl From<ResourceIdent> for ObjectLabel {
227    fn from(ident: ResourceIdent) -> Self {
228        (&ident).into()
229    }
230}
231
232pub trait ResourceExt {
233    /// Get the name of the resource
234    fn resource_name(&self) -> ResourceName;
235
236    /// Get the reference for the resource
237    ///
238    /// Depending on the resource type, this may be a UUID or a name.
239    /// If possible, implementations should prefer to use the UUID
240    /// as it is globally unique. However not all resource-like objects
241    /// have a UUID field, or the UUID field may be optional.
242    fn resource_ref(&self) -> ResourceRef;
243
244    /// Get the ident for the resource
245    fn resource_ident(&self) -> ResourceIdent;
246}
247
248impl<T: ResourceExt> From<&T> for ResourceIdent {
249    fn from(resource: &T) -> Self {
250        resource.resource_ident()
251    }
252}
253
254impl ObjectLabel {
255    pub fn to_ident(&self, id: impl Into<ResourceRef>) -> ResourceIdent {
256        match self {
257            ObjectLabel::Agent => ResourceIdent::agent(id),
258            ObjectLabel::AgentSkill => ResourceIdent::agent_skill(id),
259            ObjectLabel::Share => ResourceIdent::share(id),
260            ObjectLabel::Credential => ResourceIdent::credential(id),
261            ObjectLabel::Catalog => ResourceIdent::catalog(id),
262            ObjectLabel::Schema => ResourceIdent::schema(id),
263            ObjectLabel::Table => ResourceIdent::table(id),
264            ObjectLabel::ExternalLocation => ResourceIdent::external_location(id),
265            ObjectLabel::Recipient => ResourceIdent::recipient(id),
266            ObjectLabel::Provider => ResourceIdent::provider(id),
267            ObjectLabel::Column => ResourceIdent::column(id),
268            ObjectLabel::Volume => ResourceIdent::volume(id),
269            ObjectLabel::Function => ResourceIdent::function(id),
270            ObjectLabel::TagPolicy => ResourceIdent::tag_policy(id),
271            ObjectLabel::StagingTable => ResourceIdent::staging_table(id),
272            ObjectLabel::PolicyInfo => ResourceIdent::policy_info(id),
273            ObjectLabel::RegisteredModel => ResourceIdent::registered_model(id),
274            ObjectLabel::ModelVersion => ResourceIdent::model_version(id),
275        }
276    }
277}