1use std::time::Duration;
17
18use mz_compute_types::config::ComputeReplicaLogging;
19use mz_controller_types::ReplicaId;
20use mz_proto::{ProtoMapEntry, ProtoType, RustType, TryFromProtoError};
21use mz_repr::adt::mz_acl_item::{AclMode, MzAclItem};
22use mz_repr::network_policy_id::NetworkPolicyId;
23use mz_repr::role_id::RoleId;
24use mz_repr::{CatalogItemId, GlobalId, RelationVersion};
25use mz_sql::catalog::{
26 AutoProvisionSource, CatalogItemType, ObjectType, RoleAttributes, RoleMembership, RoleVars,
27};
28use mz_sql::names::{
29 CommentObjectId, DatabaseId, ResolvedDatabaseSpecifier, SchemaId, SchemaSpecifier,
30};
31use mz_sql::plan::{
32 ClusterSchedule, NetworkPolicyRule, NetworkPolicyRuleAction, NetworkPolicyRuleDirection,
33 PolicyAddress,
34};
35use mz_sql::session::vars::OwnedVarInput;
36use mz_storage_types::instances::StorageInstanceId;
37
38impl From<String> for crate::objects::StringWrapper {
39 fn from(value: String) -> Self {
40 crate::objects::StringWrapper { inner: value }
41 }
42}
43
44impl RustType<crate::objects::Duration> for Duration {
45 fn into_proto(&self) -> crate::objects::Duration {
46 crate::objects::Duration {
47 secs: self.as_secs(),
48 nanos: self.subsec_nanos(),
49 }
50 }
51
52 fn from_proto(proto: crate::objects::Duration) -> Result<Self, TryFromProtoError> {
53 Ok(Duration::new(proto.secs, proto.nanos))
54 }
55}
56
57impl RustType<crate::objects::RoleId> for RoleId {
58 fn into_proto(&self) -> crate::objects::RoleId {
59 match self {
60 RoleId::User(id) => crate::objects::RoleId::User(*id),
61 RoleId::System(id) => crate::objects::RoleId::System(*id),
62 RoleId::Predefined(id) => crate::objects::RoleId::Predefined(*id),
63 RoleId::Public => crate::objects::RoleId::Public,
64 }
65 }
66
67 fn from_proto(proto: crate::objects::RoleId) -> Result<Self, TryFromProtoError> {
68 let id = match proto {
69 crate::objects::RoleId::User(id) => RoleId::User(id),
70 crate::objects::RoleId::System(id) => RoleId::System(id),
71 crate::objects::RoleId::Predefined(id) => RoleId::Predefined(id),
72 crate::objects::RoleId::Public => RoleId::Public,
73 };
74 Ok(id)
75 }
76}
77
78impl RustType<crate::objects::AclMode> for AclMode {
79 fn into_proto(&self) -> crate::objects::AclMode {
80 crate::objects::AclMode {
81 bitflags: self.bits(),
82 }
83 }
84
85 fn from_proto(proto: crate::objects::AclMode) -> Result<Self, TryFromProtoError> {
86 AclMode::from_bits(proto.bitflags).ok_or_else(|| {
87 TryFromProtoError::InvalidBitFlags(format!("Invalid AclMode from catalog {proto:?}"))
88 })
89 }
90}
91
92impl RustType<crate::objects::MzAclItem> for MzAclItem {
93 fn into_proto(&self) -> crate::objects::MzAclItem {
94 crate::objects::MzAclItem {
95 grantee: self.grantee.into_proto(),
96 grantor: self.grantor.into_proto(),
97 acl_mode: self.acl_mode.into_proto(),
98 }
99 }
100
101 fn from_proto(proto: crate::objects::MzAclItem) -> Result<Self, TryFromProtoError> {
102 Ok(MzAclItem {
103 grantee: proto.grantee.into_rust()?,
104 grantor: proto.grantor.into_rust()?,
105 acl_mode: proto.acl_mode.into_rust()?,
106 })
107 }
108}
109
110impl RustType<crate::objects::AutoProvisionSource> for AutoProvisionSource {
111 fn into_proto(&self) -> crate::objects::AutoProvisionSource {
112 match self {
113 AutoProvisionSource::Oidc => crate::objects::AutoProvisionSource::Oidc,
114 AutoProvisionSource::Frontegg => crate::objects::AutoProvisionSource::Frontegg,
115 AutoProvisionSource::None => crate::objects::AutoProvisionSource::None,
116 }
117 }
118
119 fn from_proto(proto: crate::objects::AutoProvisionSource) -> Result<Self, TryFromProtoError> {
120 Ok(match proto {
121 crate::objects::AutoProvisionSource::Oidc => AutoProvisionSource::Oidc,
122 crate::objects::AutoProvisionSource::Frontegg => AutoProvisionSource::Frontegg,
123 crate::objects::AutoProvisionSource::None => AutoProvisionSource::None,
124 })
125 }
126}
127
128impl RustType<crate::objects::RoleAttributes> for RoleAttributes {
129 fn into_proto(&self) -> crate::objects::RoleAttributes {
130 crate::objects::RoleAttributes {
131 inherit: self.inherit,
132 superuser: self.superuser,
133 login: self.login,
134 auto_provision_source: self.auto_provision_source.into_proto(),
135 }
136 }
137
138 fn from_proto(proto: crate::objects::RoleAttributes) -> Result<Self, TryFromProtoError> {
139 let mut attributes = RoleAttributes::new();
140
141 attributes.inherit = proto.inherit;
142 attributes.superuser = proto.superuser;
143 attributes.login = proto.login;
144 attributes.auto_provision_source = proto.auto_provision_source.into_rust()?;
145
146 Ok(attributes)
147 }
148}
149
150impl RustType<crate::objects::RoleVar> for OwnedVarInput {
151 fn into_proto(&self) -> crate::objects::RoleVar {
152 match self.clone() {
153 OwnedVarInput::Flat(v) => crate::objects::RoleVar::Flat(v),
154 OwnedVarInput::SqlSet(entries) => crate::objects::RoleVar::SqlSet(entries),
155 }
156 }
157
158 fn from_proto(proto: crate::objects::RoleVar) -> Result<Self, TryFromProtoError> {
159 let result = match proto {
160 crate::objects::RoleVar::Flat(v) => OwnedVarInput::Flat(v),
161 crate::objects::RoleVar::SqlSet(entries) => OwnedVarInput::SqlSet(entries),
162 };
163 Ok(result)
164 }
165}
166
167impl RustType<crate::objects::RoleVars> for RoleVars {
168 fn into_proto(&self) -> crate::objects::RoleVars {
169 let entries = self
170 .map
171 .clone()
172 .into_iter()
173 .map(|(key, val)| crate::objects::RoleVarsEntry {
174 key,
175 val: val.into_proto(),
176 })
177 .collect();
178
179 crate::objects::RoleVars { entries }
180 }
181
182 fn from_proto(proto: crate::objects::RoleVars) -> Result<Self, TryFromProtoError> {
183 let map = proto
184 .entries
185 .into_iter()
186 .map(|entry| {
187 let val = entry.val.into_rust()?;
188 Ok::<_, TryFromProtoError>((entry.key, val))
189 })
190 .collect::<Result<_, _>>()?;
191
192 Ok(RoleVars { map })
193 }
194}
195
196impl RustType<crate::objects::NetworkPolicyId> for NetworkPolicyId {
197 fn into_proto(&self) -> crate::objects::NetworkPolicyId {
198 match self {
199 NetworkPolicyId::User(id) => crate::objects::NetworkPolicyId::User(*id),
200 NetworkPolicyId::System(id) => crate::objects::NetworkPolicyId::System(*id),
201 }
202 }
203
204 fn from_proto(proto: crate::objects::NetworkPolicyId) -> Result<Self, TryFromProtoError> {
205 let id = match proto {
206 crate::objects::NetworkPolicyId::User(id) => NetworkPolicyId::User(id),
207 crate::objects::NetworkPolicyId::System(id) => NetworkPolicyId::System(id),
208 };
209 Ok(id)
210 }
211}
212
213impl RustType<crate::objects::CatalogItemType> for CatalogItemType {
214 fn into_proto(&self) -> crate::objects::CatalogItemType {
215 match self {
216 CatalogItemType::Table => crate::objects::CatalogItemType::Table,
217 CatalogItemType::Source => crate::objects::CatalogItemType::Source,
218 CatalogItemType::Sink => crate::objects::CatalogItemType::Sink,
219 CatalogItemType::View => crate::objects::CatalogItemType::View,
220 CatalogItemType::MaterializedView => crate::objects::CatalogItemType::MaterializedView,
221 CatalogItemType::Index => crate::objects::CatalogItemType::Index,
222 CatalogItemType::Type => crate::objects::CatalogItemType::Type,
223 CatalogItemType::Func => crate::objects::CatalogItemType::Func,
224 CatalogItemType::Secret => crate::objects::CatalogItemType::Secret,
225 CatalogItemType::Connection => crate::objects::CatalogItemType::Connection,
226 CatalogItemType::ContinualTask => crate::objects::CatalogItemType::ContinualTask,
227 }
228 }
229
230 fn from_proto(proto: crate::objects::CatalogItemType) -> Result<Self, TryFromProtoError> {
231 let item_type = match proto {
232 crate::objects::CatalogItemType::Table => CatalogItemType::Table,
233 crate::objects::CatalogItemType::Source => CatalogItemType::Source,
234 crate::objects::CatalogItemType::Sink => CatalogItemType::Sink,
235 crate::objects::CatalogItemType::View => CatalogItemType::View,
236 crate::objects::CatalogItemType::MaterializedView => CatalogItemType::MaterializedView,
237 crate::objects::CatalogItemType::Index => CatalogItemType::Index,
238 crate::objects::CatalogItemType::Type => CatalogItemType::Type,
239 crate::objects::CatalogItemType::Func => CatalogItemType::Func,
240 crate::objects::CatalogItemType::Secret => CatalogItemType::Secret,
241 crate::objects::CatalogItemType::Connection => CatalogItemType::Connection,
242 crate::objects::CatalogItemType::ContinualTask => CatalogItemType::ContinualTask,
243 crate::objects::CatalogItemType::Unknown => {
244 return Err(TryFromProtoError::unknown_enum_variant("CatalogItemType"));
245 }
246 };
247 Ok(item_type)
248 }
249}
250
251impl RustType<crate::objects::ObjectType> for ObjectType {
252 fn into_proto(&self) -> crate::objects::ObjectType {
253 match self {
254 ObjectType::Table => crate::objects::ObjectType::Table,
255 ObjectType::View => crate::objects::ObjectType::View,
256 ObjectType::MaterializedView => crate::objects::ObjectType::MaterializedView,
257 ObjectType::Source => crate::objects::ObjectType::Source,
258 ObjectType::Sink => crate::objects::ObjectType::Sink,
259 ObjectType::Index => crate::objects::ObjectType::Index,
260 ObjectType::Type => crate::objects::ObjectType::Type,
261 ObjectType::Role => crate::objects::ObjectType::Role,
262 ObjectType::Cluster => crate::objects::ObjectType::Cluster,
263 ObjectType::ClusterReplica => crate::objects::ObjectType::ClusterReplica,
264 ObjectType::Secret => crate::objects::ObjectType::Secret,
265 ObjectType::Connection => crate::objects::ObjectType::Connection,
266 ObjectType::Database => crate::objects::ObjectType::Database,
267 ObjectType::Schema => crate::objects::ObjectType::Schema,
268 ObjectType::Func => crate::objects::ObjectType::Func,
269 ObjectType::ContinualTask => crate::objects::ObjectType::ContinualTask,
270 ObjectType::NetworkPolicy => crate::objects::ObjectType::NetworkPolicy,
271 }
272 }
273
274 fn from_proto(proto: crate::objects::ObjectType) -> Result<Self, TryFromProtoError> {
275 match proto {
276 crate::objects::ObjectType::Table => Ok(ObjectType::Table),
277 crate::objects::ObjectType::View => Ok(ObjectType::View),
278 crate::objects::ObjectType::MaterializedView => Ok(ObjectType::MaterializedView),
279 crate::objects::ObjectType::Source => Ok(ObjectType::Source),
280 crate::objects::ObjectType::Sink => Ok(ObjectType::Sink),
281 crate::objects::ObjectType::Index => Ok(ObjectType::Index),
282 crate::objects::ObjectType::Type => Ok(ObjectType::Type),
283 crate::objects::ObjectType::Role => Ok(ObjectType::Role),
284 crate::objects::ObjectType::Cluster => Ok(ObjectType::Cluster),
285 crate::objects::ObjectType::ClusterReplica => Ok(ObjectType::ClusterReplica),
286 crate::objects::ObjectType::Secret => Ok(ObjectType::Secret),
287 crate::objects::ObjectType::Connection => Ok(ObjectType::Connection),
288 crate::objects::ObjectType::Database => Ok(ObjectType::Database),
289 crate::objects::ObjectType::Schema => Ok(ObjectType::Schema),
290 crate::objects::ObjectType::Func => Ok(ObjectType::Func),
291 crate::objects::ObjectType::ContinualTask => Ok(ObjectType::ContinualTask),
292 crate::objects::ObjectType::NetworkPolicy => Ok(ObjectType::NetworkPolicy),
293 crate::objects::ObjectType::Unknown => Err(TryFromProtoError::unknown_enum_variant(
294 "ObjectType::Unknown",
295 )),
296 }
297 }
298}
299
300impl RustType<crate::objects::RoleMembership> for RoleMembership {
301 fn into_proto(&self) -> crate::objects::RoleMembership {
302 crate::objects::RoleMembership {
303 map: self
304 .map
305 .iter()
306 .map(|(key, val)| crate::objects::RoleMembershipEntry {
307 key: key.into_proto(),
308 value: val.into_proto(),
309 })
310 .collect(),
311 }
312 }
313
314 fn from_proto(proto: crate::objects::RoleMembership) -> Result<Self, TryFromProtoError> {
315 Ok(RoleMembership {
316 map: proto
317 .map
318 .into_iter()
319 .map(|e| {
320 let key = e.key.into_rust()?;
321 let val = e.value.into_rust()?;
322
323 Ok((key, val))
324 })
325 .collect::<Result<_, TryFromProtoError>>()?,
326 })
327 }
328}
329
330impl RustType<crate::objects::ResolvedDatabaseSpecifier> for ResolvedDatabaseSpecifier {
331 fn into_proto(&self) -> crate::objects::ResolvedDatabaseSpecifier {
332 match self {
333 ResolvedDatabaseSpecifier::Ambient => {
334 crate::objects::ResolvedDatabaseSpecifier::Ambient
335 }
336 ResolvedDatabaseSpecifier::Id(database_id) => {
337 crate::objects::ResolvedDatabaseSpecifier::Id(database_id.into_proto())
338 }
339 }
340 }
341
342 fn from_proto(
343 proto: crate::objects::ResolvedDatabaseSpecifier,
344 ) -> Result<Self, TryFromProtoError> {
345 let spec = match proto {
346 crate::objects::ResolvedDatabaseSpecifier::Ambient => {
347 ResolvedDatabaseSpecifier::Ambient
348 }
349 crate::objects::ResolvedDatabaseSpecifier::Id(database_id) => {
350 ResolvedDatabaseSpecifier::Id(database_id.into_rust()?)
351 }
352 };
353 Ok(spec)
354 }
355}
356
357impl RustType<crate::objects::SchemaSpecifier> for SchemaSpecifier {
358 fn into_proto(&self) -> crate::objects::SchemaSpecifier {
359 match self {
360 SchemaSpecifier::Temporary => crate::objects::SchemaSpecifier::Temporary,
361 SchemaSpecifier::Id(schema_id) => {
362 crate::objects::SchemaSpecifier::Id(schema_id.into_proto())
363 }
364 }
365 }
366
367 fn from_proto(proto: crate::objects::SchemaSpecifier) -> Result<Self, TryFromProtoError> {
368 let spec = match proto {
369 crate::objects::SchemaSpecifier::Temporary => SchemaSpecifier::Temporary,
370 crate::objects::SchemaSpecifier::Id(schema_id) => {
371 SchemaSpecifier::Id(schema_id.into_rust()?)
372 }
373 };
374 Ok(spec)
375 }
376}
377
378impl RustType<crate::objects::SchemaId> for SchemaId {
379 fn into_proto(&self) -> crate::objects::SchemaId {
380 match self {
381 SchemaId::User(id) => crate::objects::SchemaId::User(*id),
382 SchemaId::System(id) => crate::objects::SchemaId::System(*id),
383 }
384 }
385
386 fn from_proto(proto: crate::objects::SchemaId) -> Result<Self, TryFromProtoError> {
387 let id = match proto {
388 crate::objects::SchemaId::User(id) => SchemaId::User(id),
389 crate::objects::SchemaId::System(id) => SchemaId::System(id),
390 };
391 Ok(id)
392 }
393}
394
395impl RustType<crate::objects::DatabaseId> for DatabaseId {
396 fn into_proto(&self) -> crate::objects::DatabaseId {
397 match self {
398 DatabaseId::User(id) => crate::objects::DatabaseId::User(*id),
399 DatabaseId::System(id) => crate::objects::DatabaseId::System(*id),
400 }
401 }
402
403 fn from_proto(proto: crate::objects::DatabaseId) -> Result<Self, TryFromProtoError> {
404 match proto {
405 crate::objects::DatabaseId::User(id) => Ok(DatabaseId::User(id)),
406 crate::objects::DatabaseId::System(id) => Ok(DatabaseId::System(id)),
407 }
408 }
409}
410
411impl RustType<crate::objects::CommentObject> for CommentObjectId {
412 fn into_proto(&self) -> crate::objects::CommentObject {
413 match self {
414 CommentObjectId::Table(global_id) => {
415 crate::objects::CommentObject::Table(global_id.into_proto())
416 }
417 CommentObjectId::View(global_id) => {
418 crate::objects::CommentObject::View(global_id.into_proto())
419 }
420 CommentObjectId::MaterializedView(global_id) => {
421 crate::objects::CommentObject::MaterializedView(global_id.into_proto())
422 }
423 CommentObjectId::Source(global_id) => {
424 crate::objects::CommentObject::Source(global_id.into_proto())
425 }
426 CommentObjectId::Sink(global_id) => {
427 crate::objects::CommentObject::Sink(global_id.into_proto())
428 }
429 CommentObjectId::Index(global_id) => {
430 crate::objects::CommentObject::Index(global_id.into_proto())
431 }
432 CommentObjectId::Func(global_id) => {
433 crate::objects::CommentObject::Func(global_id.into_proto())
434 }
435 CommentObjectId::Connection(global_id) => {
436 crate::objects::CommentObject::Connection(global_id.into_proto())
437 }
438 CommentObjectId::Type(global_id) => {
439 crate::objects::CommentObject::Type(global_id.into_proto())
440 }
441 CommentObjectId::Secret(global_id) => {
442 crate::objects::CommentObject::Secret(global_id.into_proto())
443 }
444 CommentObjectId::Role(role_id) => {
445 crate::objects::CommentObject::Role(role_id.into_proto())
446 }
447 CommentObjectId::Database(database_id) => {
448 crate::objects::CommentObject::Database(database_id.into_proto())
449 }
450 CommentObjectId::ContinualTask(global_id) => {
451 crate::objects::CommentObject::ContinualTask(global_id.into_proto())
452 }
453 CommentObjectId::NetworkPolicy(network_policy_id) => {
454 crate::objects::CommentObject::NetworkPolicy(network_policy_id.into_proto())
455 }
456 CommentObjectId::Schema((database, schema)) => {
457 crate::objects::CommentObject::Schema(crate::objects::ResolvedSchema {
458 database: database.into_proto(),
459 schema: schema.into_proto(),
460 })
461 }
462 CommentObjectId::Cluster(cluster_id) => {
463 crate::objects::CommentObject::Cluster(cluster_id.into_proto())
464 }
465 CommentObjectId::ClusterReplica((cluster_id, replica_id)) => {
466 let cluster_replica_id = crate::objects::ClusterReplicaId {
467 cluster_id: cluster_id.into_proto(),
468 replica_id: replica_id.into_proto(),
469 };
470 crate::objects::CommentObject::ClusterReplica(cluster_replica_id)
471 }
472 }
473 }
474
475 fn from_proto(proto: crate::objects::CommentObject) -> Result<Self, TryFromProtoError> {
476 let id = match proto {
477 crate::objects::CommentObject::Table(item_id) => {
478 CommentObjectId::Table(item_id.into_rust()?)
479 }
480 crate::objects::CommentObject::View(item_id) => {
481 CommentObjectId::View(item_id.into_rust()?)
482 }
483 crate::objects::CommentObject::MaterializedView(item_id) => {
484 CommentObjectId::MaterializedView(item_id.into_rust()?)
485 }
486 crate::objects::CommentObject::Source(item_id) => {
487 CommentObjectId::Source(item_id.into_rust()?)
488 }
489 crate::objects::CommentObject::Sink(item_id) => {
490 CommentObjectId::Sink(item_id.into_rust()?)
491 }
492 crate::objects::CommentObject::Index(item_id) => {
493 CommentObjectId::Index(item_id.into_rust()?)
494 }
495 crate::objects::CommentObject::Func(item_id) => {
496 CommentObjectId::Func(item_id.into_rust()?)
497 }
498 crate::objects::CommentObject::Connection(item_id) => {
499 CommentObjectId::Connection(item_id.into_rust()?)
500 }
501 crate::objects::CommentObject::Type(item_id) => {
502 CommentObjectId::Type(item_id.into_rust()?)
503 }
504 crate::objects::CommentObject::Secret(item_id) => {
505 CommentObjectId::Secret(item_id.into_rust()?)
506 }
507 crate::objects::CommentObject::ContinualTask(item_id) => {
508 CommentObjectId::ContinualTask(item_id.into_rust()?)
509 }
510 crate::objects::CommentObject::NetworkPolicy(global_id) => {
511 CommentObjectId::NetworkPolicy(global_id.into_rust()?)
512 }
513 crate::objects::CommentObject::Role(role_id) => {
514 CommentObjectId::Role(role_id.into_rust()?)
515 }
516 crate::objects::CommentObject::Database(database_id) => {
517 CommentObjectId::Database(database_id.into_rust()?)
518 }
519 crate::objects::CommentObject::Schema(resolved_schema) => {
520 let database = resolved_schema.database.into_rust()?;
521 let schema = resolved_schema.schema.into_rust()?;
522 CommentObjectId::Schema((database, schema))
523 }
524 crate::objects::CommentObject::Cluster(cluster_id) => {
525 CommentObjectId::Cluster(cluster_id.into_rust()?)
526 }
527 crate::objects::CommentObject::ClusterReplica(cluster_replica_id) => {
528 let cluster_id = cluster_replica_id.cluster_id.into_rust()?;
529 let replica_id = cluster_replica_id.replica_id.into_rust()?;
530 CommentObjectId::ClusterReplica((cluster_id, replica_id))
531 }
532 };
533 Ok(id)
534 }
535}
536
537impl RustType<crate::objects::EpochMillis> for u64 {
538 fn into_proto(&self) -> crate::objects::EpochMillis {
539 crate::objects::EpochMillis { millis: *self }
540 }
541
542 fn from_proto(proto: crate::objects::EpochMillis) -> Result<Self, TryFromProtoError> {
543 Ok(proto.millis)
544 }
545}
546
547impl RustType<crate::objects::CatalogItemId> for CatalogItemId {
548 fn into_proto(&self) -> crate::objects::CatalogItemId {
549 match self {
550 CatalogItemId::System(x) => crate::objects::CatalogItemId::System(*x),
551 CatalogItemId::IntrospectionSourceIndex(x) => {
552 crate::objects::CatalogItemId::IntrospectionSourceIndex(*x)
553 }
554 CatalogItemId::User(x) => crate::objects::CatalogItemId::User(*x),
555 CatalogItemId::Transient(x) => crate::objects::CatalogItemId::Transient(*x),
556 }
557 }
558
559 fn from_proto(proto: crate::objects::CatalogItemId) -> Result<Self, TryFromProtoError> {
560 match proto {
561 crate::objects::CatalogItemId::System(x) => Ok(CatalogItemId::System(x)),
562 crate::objects::CatalogItemId::IntrospectionSourceIndex(x) => {
563 Ok(CatalogItemId::IntrospectionSourceIndex(x))
564 }
565 crate::objects::CatalogItemId::User(x) => Ok(CatalogItemId::User(x)),
566 crate::objects::CatalogItemId::Transient(x) => Ok(CatalogItemId::Transient(x)),
567 }
568 }
569}
570
571impl RustType<crate::objects::GlobalId> for GlobalId {
572 fn into_proto(&self) -> crate::objects::GlobalId {
573 match self {
574 GlobalId::System(x) => crate::objects::GlobalId::System(*x),
575 GlobalId::IntrospectionSourceIndex(x) => {
576 crate::objects::GlobalId::IntrospectionSourceIndex(*x)
577 }
578 GlobalId::User(x) => crate::objects::GlobalId::User(*x),
579 GlobalId::Transient(x) => crate::objects::GlobalId::Transient(*x),
580 GlobalId::Explain => crate::objects::GlobalId::Explain,
581 }
582 }
583
584 fn from_proto(proto: crate::objects::GlobalId) -> Result<Self, TryFromProtoError> {
585 match proto {
586 crate::objects::GlobalId::System(x) => Ok(GlobalId::System(x)),
587 crate::objects::GlobalId::IntrospectionSourceIndex(x) => {
588 Ok(GlobalId::IntrospectionSourceIndex(x))
589 }
590 crate::objects::GlobalId::User(x) => Ok(GlobalId::User(x)),
591 crate::objects::GlobalId::Transient(x) => Ok(GlobalId::Transient(x)),
592 crate::objects::GlobalId::Explain => Ok(GlobalId::Explain),
593 }
594 }
595}
596
597impl RustType<crate::objects::ClusterId> for StorageInstanceId {
598 fn into_proto(&self) -> crate::objects::ClusterId {
599 match self {
600 StorageInstanceId::User(id) => crate::objects::ClusterId::User(*id),
601 StorageInstanceId::System(id) => crate::objects::ClusterId::System(*id),
602 }
603 }
604
605 fn from_proto(proto: crate::objects::ClusterId) -> Result<Self, TryFromProtoError> {
606 let id = match proto {
607 crate::objects::ClusterId::User(id) => {
608 StorageInstanceId::user(id).ok_or_else(|| {
609 TryFromProtoError::InvalidPersistState(format!(
610 "{id} is not a valid StorageInstanceId"
611 ))
612 })?
613 }
614 crate::objects::ClusterId::System(id) => {
615 StorageInstanceId::system(id).ok_or_else(|| {
616 TryFromProtoError::InvalidPersistState(format!(
617 "{id} is not a valid StorageInstanceId"
618 ))
619 })?
620 }
621 };
622 Ok(id)
623 }
624}
625
626impl RustType<crate::objects::ReplicaId> for ReplicaId {
627 fn into_proto(&self) -> crate::objects::ReplicaId {
628 match self {
629 Self::System(id) => crate::objects::ReplicaId::System(*id),
630 Self::User(id) => crate::objects::ReplicaId::User(*id),
631 }
632 }
633
634 fn from_proto(proto: crate::objects::ReplicaId) -> Result<Self, TryFromProtoError> {
635 match proto {
636 crate::objects::ReplicaId::System(id) => Ok(Self::System(id)),
637 crate::objects::ReplicaId::User(id) => Ok(Self::User(id)),
638 }
639 }
640}
641
642impl ProtoMapEntry<String, String> for crate::objects::OptimizerFeatureOverride {
643 fn from_rust<'a>(entry: (&'a String, &'a String)) -> Self {
644 crate::objects::OptimizerFeatureOverride {
645 name: entry.0.into_proto(),
646 value: entry.1.into_proto(),
647 }
648 }
649
650 fn into_rust(self) -> Result<(String, String), TryFromProtoError> {
651 Ok((self.name.into_rust()?, self.value.into_rust()?))
652 }
653}
654
655impl RustType<crate::objects::ClusterSchedule> for ClusterSchedule {
656 fn into_proto(&self) -> crate::objects::ClusterSchedule {
657 match self {
658 ClusterSchedule::Manual => crate::objects::ClusterSchedule::Manual,
659 ClusterSchedule::Refresh {
660 hydration_time_estimate,
661 } => crate::objects::ClusterSchedule::Refresh(
662 crate::objects::ClusterScheduleRefreshOptions {
663 rehydration_time_estimate: hydration_time_estimate.into_proto(),
664 },
665 ),
666 }
667 }
668
669 fn from_proto(proto: crate::objects::ClusterSchedule) -> Result<Self, TryFromProtoError> {
670 match proto {
671 crate::objects::ClusterSchedule::Manual => Ok(ClusterSchedule::Manual),
672 crate::objects::ClusterSchedule::Refresh(csro) => Ok(ClusterSchedule::Refresh {
673 hydration_time_estimate: csro.rehydration_time_estimate.into_rust()?,
674 }),
675 }
676 }
677}
678
679impl RustType<crate::objects::ReplicaLogging> for ComputeReplicaLogging {
680 fn into_proto(&self) -> crate::objects::ReplicaLogging {
681 crate::objects::ReplicaLogging {
682 log_logging: self.log_logging,
683 interval: self.interval.into_proto(),
684 }
685 }
686
687 fn from_proto(proto: crate::objects::ReplicaLogging) -> Result<Self, TryFromProtoError> {
688 Ok(ComputeReplicaLogging {
689 log_logging: proto.log_logging,
690 interval: proto.interval.into_rust()?,
691 })
692 }
693}
694
695impl RustType<crate::objects::Version> for RelationVersion {
696 fn into_proto(&self) -> crate::objects::Version {
697 crate::objects::Version {
698 value: self.into_raw(),
699 }
700 }
701
702 fn from_proto(proto: crate::objects::Version) -> Result<Self, TryFromProtoError> {
703 Ok(RelationVersion::from_raw(proto.value))
704 }
705}
706
707impl RustType<crate::objects::NetworkPolicyRule> for NetworkPolicyRule {
708 fn into_proto(&self) -> crate::objects::NetworkPolicyRule {
709 crate::objects::NetworkPolicyRule {
710 name: self.name.clone(),
711 action: match self.action {
712 NetworkPolicyRuleAction::Allow => crate::objects::NetworkPolicyRuleAction::Allow,
713 },
714 direction: match self.direction {
715 NetworkPolicyRuleDirection::Ingress => {
716 crate::objects::NetworkPolicyRuleDirection::Ingress
717 }
718 },
719 address: self.address.clone().to_string(),
720 }
721 }
722
723 fn from_proto(proto: crate::objects::NetworkPolicyRule) -> Result<Self, TryFromProtoError> {
724 Ok(NetworkPolicyRule {
725 name: proto.name,
726 action: match proto.action {
727 crate::objects::NetworkPolicyRuleAction::Allow => NetworkPolicyRuleAction::Allow,
728 },
729 address: PolicyAddress::from(proto.address),
730 direction: match proto.direction {
731 crate::objects::NetworkPolicyRuleDirection::Ingress => {
732 NetworkPolicyRuleDirection::Ingress
733 }
734 },
735 })
736 }
737}