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 }
227 }
228
229 fn from_proto(proto: crate::objects::CatalogItemType) -> Result<Self, TryFromProtoError> {
230 let item_type = match proto {
231 crate::objects::CatalogItemType::Table => CatalogItemType::Table,
232 crate::objects::CatalogItemType::Source => CatalogItemType::Source,
233 crate::objects::CatalogItemType::Sink => CatalogItemType::Sink,
234 crate::objects::CatalogItemType::View => CatalogItemType::View,
235 crate::objects::CatalogItemType::MaterializedView => CatalogItemType::MaterializedView,
236 crate::objects::CatalogItemType::Index => CatalogItemType::Index,
237 crate::objects::CatalogItemType::Type => CatalogItemType::Type,
238 crate::objects::CatalogItemType::Func => CatalogItemType::Func,
239 crate::objects::CatalogItemType::Secret => CatalogItemType::Secret,
240 crate::objects::CatalogItemType::Connection => CatalogItemType::Connection,
241 crate::objects::CatalogItemType::Unknown => {
242 return Err(TryFromProtoError::unknown_enum_variant("CatalogItemType"));
243 }
244 };
245 Ok(item_type)
246 }
247}
248
249impl RustType<crate::objects::ObjectType> for ObjectType {
250 fn into_proto(&self) -> crate::objects::ObjectType {
251 match self {
252 ObjectType::Table => crate::objects::ObjectType::Table,
253 ObjectType::View => crate::objects::ObjectType::View,
254 ObjectType::MaterializedView => crate::objects::ObjectType::MaterializedView,
255 ObjectType::Source => crate::objects::ObjectType::Source,
256 ObjectType::Sink => crate::objects::ObjectType::Sink,
257 ObjectType::Index => crate::objects::ObjectType::Index,
258 ObjectType::Type => crate::objects::ObjectType::Type,
259 ObjectType::Role => crate::objects::ObjectType::Role,
260 ObjectType::Cluster => crate::objects::ObjectType::Cluster,
261 ObjectType::ClusterReplica => crate::objects::ObjectType::ClusterReplica,
262 ObjectType::Secret => crate::objects::ObjectType::Secret,
263 ObjectType::Connection => crate::objects::ObjectType::Connection,
264 ObjectType::Database => crate::objects::ObjectType::Database,
265 ObjectType::Schema => crate::objects::ObjectType::Schema,
266 ObjectType::Func => crate::objects::ObjectType::Func,
267 ObjectType::NetworkPolicy => crate::objects::ObjectType::NetworkPolicy,
268 }
269 }
270
271 fn from_proto(proto: crate::objects::ObjectType) -> Result<Self, TryFromProtoError> {
272 match proto {
273 crate::objects::ObjectType::Table => Ok(ObjectType::Table),
274 crate::objects::ObjectType::View => Ok(ObjectType::View),
275 crate::objects::ObjectType::MaterializedView => Ok(ObjectType::MaterializedView),
276 crate::objects::ObjectType::Source => Ok(ObjectType::Source),
277 crate::objects::ObjectType::Sink => Ok(ObjectType::Sink),
278 crate::objects::ObjectType::Index => Ok(ObjectType::Index),
279 crate::objects::ObjectType::Type => Ok(ObjectType::Type),
280 crate::objects::ObjectType::Role => Ok(ObjectType::Role),
281 crate::objects::ObjectType::Cluster => Ok(ObjectType::Cluster),
282 crate::objects::ObjectType::ClusterReplica => Ok(ObjectType::ClusterReplica),
283 crate::objects::ObjectType::Secret => Ok(ObjectType::Secret),
284 crate::objects::ObjectType::Connection => Ok(ObjectType::Connection),
285 crate::objects::ObjectType::Database => Ok(ObjectType::Database),
286 crate::objects::ObjectType::Schema => Ok(ObjectType::Schema),
287 crate::objects::ObjectType::Func => Ok(ObjectType::Func),
288 crate::objects::ObjectType::NetworkPolicy => Ok(ObjectType::NetworkPolicy),
289 crate::objects::ObjectType::Unknown => Err(TryFromProtoError::unknown_enum_variant(
290 "ObjectType::Unknown",
291 )),
292 }
293 }
294}
295
296impl RustType<crate::objects::RoleMembership> for RoleMembership {
297 fn into_proto(&self) -> crate::objects::RoleMembership {
298 crate::objects::RoleMembership {
299 map: self
300 .map
301 .iter()
302 .map(|(key, val)| crate::objects::RoleMembershipEntry {
303 key: key.into_proto(),
304 value: val.into_proto(),
305 })
306 .collect(),
307 }
308 }
309
310 fn from_proto(proto: crate::objects::RoleMembership) -> Result<Self, TryFromProtoError> {
311 Ok(RoleMembership {
312 map: proto
313 .map
314 .into_iter()
315 .map(|e| {
316 let key = e.key.into_rust()?;
317 let val = e.value.into_rust()?;
318
319 Ok((key, val))
320 })
321 .collect::<Result<_, TryFromProtoError>>()?,
322 })
323 }
324}
325
326impl RustType<crate::objects::ResolvedDatabaseSpecifier> for ResolvedDatabaseSpecifier {
327 fn into_proto(&self) -> crate::objects::ResolvedDatabaseSpecifier {
328 match self {
329 ResolvedDatabaseSpecifier::Ambient => {
330 crate::objects::ResolvedDatabaseSpecifier::Ambient
331 }
332 ResolvedDatabaseSpecifier::Id(database_id) => {
333 crate::objects::ResolvedDatabaseSpecifier::Id(database_id.into_proto())
334 }
335 }
336 }
337
338 fn from_proto(
339 proto: crate::objects::ResolvedDatabaseSpecifier,
340 ) -> Result<Self, TryFromProtoError> {
341 let spec = match proto {
342 crate::objects::ResolvedDatabaseSpecifier::Ambient => {
343 ResolvedDatabaseSpecifier::Ambient
344 }
345 crate::objects::ResolvedDatabaseSpecifier::Id(database_id) => {
346 ResolvedDatabaseSpecifier::Id(database_id.into_rust()?)
347 }
348 };
349 Ok(spec)
350 }
351}
352
353impl RustType<crate::objects::SchemaSpecifier> for SchemaSpecifier {
354 fn into_proto(&self) -> crate::objects::SchemaSpecifier {
355 match self {
356 SchemaSpecifier::Temporary => crate::objects::SchemaSpecifier::Temporary,
357 SchemaSpecifier::Id(schema_id) => {
358 crate::objects::SchemaSpecifier::Id(schema_id.into_proto())
359 }
360 }
361 }
362
363 fn from_proto(proto: crate::objects::SchemaSpecifier) -> Result<Self, TryFromProtoError> {
364 let spec = match proto {
365 crate::objects::SchemaSpecifier::Temporary => SchemaSpecifier::Temporary,
366 crate::objects::SchemaSpecifier::Id(schema_id) => {
367 SchemaSpecifier::Id(schema_id.into_rust()?)
368 }
369 };
370 Ok(spec)
371 }
372}
373
374impl RustType<crate::objects::SchemaId> for SchemaId {
375 fn into_proto(&self) -> crate::objects::SchemaId {
376 match self {
377 SchemaId::User(id) => crate::objects::SchemaId::User(*id),
378 SchemaId::System(id) => crate::objects::SchemaId::System(*id),
379 }
380 }
381
382 fn from_proto(proto: crate::objects::SchemaId) -> Result<Self, TryFromProtoError> {
383 let id = match proto {
384 crate::objects::SchemaId::User(id) => SchemaId::User(id),
385 crate::objects::SchemaId::System(id) => SchemaId::System(id),
386 };
387 Ok(id)
388 }
389}
390
391impl RustType<crate::objects::DatabaseId> for DatabaseId {
392 fn into_proto(&self) -> crate::objects::DatabaseId {
393 match self {
394 DatabaseId::User(id) => crate::objects::DatabaseId::User(*id),
395 DatabaseId::System(id) => crate::objects::DatabaseId::System(*id),
396 }
397 }
398
399 fn from_proto(proto: crate::objects::DatabaseId) -> Result<Self, TryFromProtoError> {
400 match proto {
401 crate::objects::DatabaseId::User(id) => Ok(DatabaseId::User(id)),
402 crate::objects::DatabaseId::System(id) => Ok(DatabaseId::System(id)),
403 }
404 }
405}
406
407impl RustType<crate::objects::CommentObject> for CommentObjectId {
408 fn into_proto(&self) -> crate::objects::CommentObject {
409 match self {
410 CommentObjectId::Table(global_id) => {
411 crate::objects::CommentObject::Table(global_id.into_proto())
412 }
413 CommentObjectId::View(global_id) => {
414 crate::objects::CommentObject::View(global_id.into_proto())
415 }
416 CommentObjectId::MaterializedView(global_id) => {
417 crate::objects::CommentObject::MaterializedView(global_id.into_proto())
418 }
419 CommentObjectId::Source(global_id) => {
420 crate::objects::CommentObject::Source(global_id.into_proto())
421 }
422 CommentObjectId::Sink(global_id) => {
423 crate::objects::CommentObject::Sink(global_id.into_proto())
424 }
425 CommentObjectId::Index(global_id) => {
426 crate::objects::CommentObject::Index(global_id.into_proto())
427 }
428 CommentObjectId::Func(global_id) => {
429 crate::objects::CommentObject::Func(global_id.into_proto())
430 }
431 CommentObjectId::Connection(global_id) => {
432 crate::objects::CommentObject::Connection(global_id.into_proto())
433 }
434 CommentObjectId::Type(global_id) => {
435 crate::objects::CommentObject::Type(global_id.into_proto())
436 }
437 CommentObjectId::Secret(global_id) => {
438 crate::objects::CommentObject::Secret(global_id.into_proto())
439 }
440 CommentObjectId::Role(role_id) => {
441 crate::objects::CommentObject::Role(role_id.into_proto())
442 }
443 CommentObjectId::Database(database_id) => {
444 crate::objects::CommentObject::Database(database_id.into_proto())
445 }
446 CommentObjectId::NetworkPolicy(network_policy_id) => {
447 crate::objects::CommentObject::NetworkPolicy(network_policy_id.into_proto())
448 }
449 CommentObjectId::Schema((database, schema)) => {
450 crate::objects::CommentObject::Schema(crate::objects::ResolvedSchema {
451 database: database.into_proto(),
452 schema: schema.into_proto(),
453 })
454 }
455 CommentObjectId::Cluster(cluster_id) => {
456 crate::objects::CommentObject::Cluster(cluster_id.into_proto())
457 }
458 CommentObjectId::ClusterReplica((cluster_id, replica_id)) => {
459 let cluster_replica_id = crate::objects::ClusterReplicaId {
460 cluster_id: cluster_id.into_proto(),
461 replica_id: replica_id.into_proto(),
462 };
463 crate::objects::CommentObject::ClusterReplica(cluster_replica_id)
464 }
465 }
466 }
467
468 fn from_proto(proto: crate::objects::CommentObject) -> Result<Self, TryFromProtoError> {
469 let id = match proto {
470 crate::objects::CommentObject::Table(item_id) => {
471 CommentObjectId::Table(item_id.into_rust()?)
472 }
473 crate::objects::CommentObject::View(item_id) => {
474 CommentObjectId::View(item_id.into_rust()?)
475 }
476 crate::objects::CommentObject::MaterializedView(item_id) => {
477 CommentObjectId::MaterializedView(item_id.into_rust()?)
478 }
479 crate::objects::CommentObject::Source(item_id) => {
480 CommentObjectId::Source(item_id.into_rust()?)
481 }
482 crate::objects::CommentObject::Sink(item_id) => {
483 CommentObjectId::Sink(item_id.into_rust()?)
484 }
485 crate::objects::CommentObject::Index(item_id) => {
486 CommentObjectId::Index(item_id.into_rust()?)
487 }
488 crate::objects::CommentObject::Func(item_id) => {
489 CommentObjectId::Func(item_id.into_rust()?)
490 }
491 crate::objects::CommentObject::Connection(item_id) => {
492 CommentObjectId::Connection(item_id.into_rust()?)
493 }
494 crate::objects::CommentObject::Type(item_id) => {
495 CommentObjectId::Type(item_id.into_rust()?)
496 }
497 crate::objects::CommentObject::Secret(item_id) => {
498 CommentObjectId::Secret(item_id.into_rust()?)
499 }
500 crate::objects::CommentObject::NetworkPolicy(global_id) => {
501 CommentObjectId::NetworkPolicy(global_id.into_rust()?)
502 }
503 crate::objects::CommentObject::Role(role_id) => {
504 CommentObjectId::Role(role_id.into_rust()?)
505 }
506 crate::objects::CommentObject::Database(database_id) => {
507 CommentObjectId::Database(database_id.into_rust()?)
508 }
509 crate::objects::CommentObject::Schema(resolved_schema) => {
510 let database = resolved_schema.database.into_rust()?;
511 let schema = resolved_schema.schema.into_rust()?;
512 CommentObjectId::Schema((database, schema))
513 }
514 crate::objects::CommentObject::Cluster(cluster_id) => {
515 CommentObjectId::Cluster(cluster_id.into_rust()?)
516 }
517 crate::objects::CommentObject::ClusterReplica(cluster_replica_id) => {
518 let cluster_id = cluster_replica_id.cluster_id.into_rust()?;
519 let replica_id = cluster_replica_id.replica_id.into_rust()?;
520 CommentObjectId::ClusterReplica((cluster_id, replica_id))
521 }
522 };
523 Ok(id)
524 }
525}
526
527impl RustType<crate::objects::EpochMillis> for u64 {
528 fn into_proto(&self) -> crate::objects::EpochMillis {
529 crate::objects::EpochMillis { millis: *self }
530 }
531
532 fn from_proto(proto: crate::objects::EpochMillis) -> Result<Self, TryFromProtoError> {
533 Ok(proto.millis)
534 }
535}
536
537impl RustType<crate::objects::CatalogItemId> for CatalogItemId {
538 fn into_proto(&self) -> crate::objects::CatalogItemId {
539 match self {
540 CatalogItemId::System(x) => crate::objects::CatalogItemId::System(*x),
541 CatalogItemId::IntrospectionSourceIndex(x) => {
542 crate::objects::CatalogItemId::IntrospectionSourceIndex(*x)
543 }
544 CatalogItemId::User(x) => crate::objects::CatalogItemId::User(*x),
545 CatalogItemId::Transient(x) => crate::objects::CatalogItemId::Transient(*x),
546 }
547 }
548
549 fn from_proto(proto: crate::objects::CatalogItemId) -> Result<Self, TryFromProtoError> {
550 match proto {
551 crate::objects::CatalogItemId::System(x) => Ok(CatalogItemId::System(x)),
552 crate::objects::CatalogItemId::IntrospectionSourceIndex(x) => {
553 Ok(CatalogItemId::IntrospectionSourceIndex(x))
554 }
555 crate::objects::CatalogItemId::User(x) => Ok(CatalogItemId::User(x)),
556 crate::objects::CatalogItemId::Transient(x) => Ok(CatalogItemId::Transient(x)),
557 }
558 }
559}
560
561impl RustType<crate::objects::GlobalId> for GlobalId {
562 fn into_proto(&self) -> crate::objects::GlobalId {
563 match self {
564 GlobalId::System(x) => crate::objects::GlobalId::System(*x),
565 GlobalId::IntrospectionSourceIndex(x) => {
566 crate::objects::GlobalId::IntrospectionSourceIndex(*x)
567 }
568 GlobalId::User(x) => crate::objects::GlobalId::User(*x),
569 GlobalId::Transient(x) => crate::objects::GlobalId::Transient(*x),
570 GlobalId::Explain => crate::objects::GlobalId::Explain,
571 }
572 }
573
574 fn from_proto(proto: crate::objects::GlobalId) -> Result<Self, TryFromProtoError> {
575 match proto {
576 crate::objects::GlobalId::System(x) => Ok(GlobalId::System(x)),
577 crate::objects::GlobalId::IntrospectionSourceIndex(x) => {
578 Ok(GlobalId::IntrospectionSourceIndex(x))
579 }
580 crate::objects::GlobalId::User(x) => Ok(GlobalId::User(x)),
581 crate::objects::GlobalId::Transient(x) => Ok(GlobalId::Transient(x)),
582 crate::objects::GlobalId::Explain => Ok(GlobalId::Explain),
583 }
584 }
585}
586
587impl RustType<crate::objects::ClusterId> for StorageInstanceId {
588 fn into_proto(&self) -> crate::objects::ClusterId {
589 match self {
590 StorageInstanceId::User(id) => crate::objects::ClusterId::User(*id),
591 StorageInstanceId::System(id) => crate::objects::ClusterId::System(*id),
592 }
593 }
594
595 fn from_proto(proto: crate::objects::ClusterId) -> Result<Self, TryFromProtoError> {
596 let id = match proto {
597 crate::objects::ClusterId::User(id) => {
598 StorageInstanceId::user(id).ok_or_else(|| {
599 TryFromProtoError::InvalidPersistState(format!(
600 "{id} is not a valid StorageInstanceId"
601 ))
602 })?
603 }
604 crate::objects::ClusterId::System(id) => {
605 StorageInstanceId::system(id).ok_or_else(|| {
606 TryFromProtoError::InvalidPersistState(format!(
607 "{id} is not a valid StorageInstanceId"
608 ))
609 })?
610 }
611 };
612 Ok(id)
613 }
614}
615
616impl RustType<crate::objects::ReplicaId> for ReplicaId {
617 fn into_proto(&self) -> crate::objects::ReplicaId {
618 match self {
619 Self::System(id) => crate::objects::ReplicaId::System(*id),
620 Self::User(id) => crate::objects::ReplicaId::User(*id),
621 }
622 }
623
624 fn from_proto(proto: crate::objects::ReplicaId) -> Result<Self, TryFromProtoError> {
625 match proto {
626 crate::objects::ReplicaId::System(id) => Ok(Self::System(id)),
627 crate::objects::ReplicaId::User(id) => Ok(Self::User(id)),
628 }
629 }
630}
631
632impl ProtoMapEntry<String, String> for crate::objects::OptimizerFeatureOverride {
633 fn from_rust<'a>(entry: (&'a String, &'a String)) -> Self {
634 crate::objects::OptimizerFeatureOverride {
635 name: entry.0.into_proto(),
636 value: entry.1.into_proto(),
637 }
638 }
639
640 fn into_rust(self) -> Result<(String, String), TryFromProtoError> {
641 Ok((self.name.into_rust()?, self.value.into_rust()?))
642 }
643}
644
645impl RustType<crate::objects::ClusterSchedule> for ClusterSchedule {
646 fn into_proto(&self) -> crate::objects::ClusterSchedule {
647 match self {
648 ClusterSchedule::Manual => crate::objects::ClusterSchedule::Manual,
649 ClusterSchedule::Refresh {
650 hydration_time_estimate,
651 } => crate::objects::ClusterSchedule::Refresh(
652 crate::objects::ClusterScheduleRefreshOptions {
653 rehydration_time_estimate: hydration_time_estimate.into_proto(),
654 },
655 ),
656 }
657 }
658
659 fn from_proto(proto: crate::objects::ClusterSchedule) -> Result<Self, TryFromProtoError> {
660 match proto {
661 crate::objects::ClusterSchedule::Manual => Ok(ClusterSchedule::Manual),
662 crate::objects::ClusterSchedule::Refresh(csro) => Ok(ClusterSchedule::Refresh {
663 hydration_time_estimate: csro.rehydration_time_estimate.into_rust()?,
664 }),
665 }
666 }
667}
668
669impl RustType<crate::objects::ReplicaLogging> for ComputeReplicaLogging {
670 fn into_proto(&self) -> crate::objects::ReplicaLogging {
671 crate::objects::ReplicaLogging {
672 log_logging: self.log_logging,
673 interval: self.interval.into_proto(),
674 }
675 }
676
677 fn from_proto(proto: crate::objects::ReplicaLogging) -> Result<Self, TryFromProtoError> {
678 Ok(ComputeReplicaLogging {
679 log_logging: proto.log_logging,
680 interval: proto.interval.into_rust()?,
681 })
682 }
683}
684
685impl RustType<crate::objects::Version> for RelationVersion {
686 fn into_proto(&self) -> crate::objects::Version {
687 crate::objects::Version {
688 value: self.into_raw(),
689 }
690 }
691
692 fn from_proto(proto: crate::objects::Version) -> Result<Self, TryFromProtoError> {
693 Ok(RelationVersion::from_raw(proto.value))
694 }
695}
696
697impl RustType<crate::objects::NetworkPolicyRule> for NetworkPolicyRule {
698 fn into_proto(&self) -> crate::objects::NetworkPolicyRule {
699 crate::objects::NetworkPolicyRule {
700 name: self.name.clone(),
701 action: match self.action {
702 NetworkPolicyRuleAction::Allow => crate::objects::NetworkPolicyRuleAction::Allow,
703 },
704 direction: match self.direction {
705 NetworkPolicyRuleDirection::Ingress => {
706 crate::objects::NetworkPolicyRuleDirection::Ingress
707 }
708 },
709 address: self.address.clone().to_string(),
710 }
711 }
712
713 fn from_proto(proto: crate::objects::NetworkPolicyRule) -> Result<Self, TryFromProtoError> {
714 Ok(NetworkPolicyRule {
715 name: proto.name,
716 action: match proto.action {
717 crate::objects::NetworkPolicyRuleAction::Allow => NetworkPolicyRuleAction::Allow,
718 },
719 address: PolicyAddress::from(proto.address),
720 direction: match proto.direction {
721 crate::objects::NetworkPolicyRuleDirection::Ingress => {
722 NetworkPolicyRuleDirection::Ingress
723 }
724 },
725 })
726 }
727}