Skip to main content

spiral/api/scandal/
objects.rs

1// Generated by tools/service-contracts/rust.py. Do not edit.
2#![doc = "Generated transport-independent contract objects."]
3
4use std::collections::BTreeMap;
5use std::error::Error as StdError;
6use std::fmt::{self, Display, Formatter};
7
8use serde::{Deserialize, Deserializer, Serialize, Serializer};
9use serde_json::Value;
10use spiral_contract::error::{ErrorEnvelope, ServiceError};
11use spiral_contract::safelong::SafeUnsignedLong;
12use spiral_contract::strict::{DeserializeStrict, Strict};
13use uuid::Uuid;
14
15/// AbortBlobUploadRequest contract value.
16#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
17pub struct AbortBlobUploadRequest {
18    /// Contract field storage.
19    #[serde(rename = "storage")]
20    #[serde(default, skip_serializing_if = "Option::is_none")]
21    pub storage: Option<StorageBinding>,
22    /// Contract field upload.
23    #[serde(rename = "upload")]
24    pub upload: BlobUpload,
25}
26impl<'de> DeserializeStrict<'de> for AbortBlobUploadRequest {
27    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
28        #[derive(Deserialize)]
29        #[serde(deny_unknown_fields)]
30        struct __Wire {
31            #[serde(rename = "storage")]
32            #[serde(default)]
33            storage: Strict<Option<StorageBinding>>,
34            #[serde(rename = "upload")]
35            upload: Strict<BlobUpload>,
36        }
37        let wire = __Wire::deserialize(deserializer)?;
38        Ok(Self {
39            storage: wire.storage.0,
40            upload: wire.upload.0,
41        })
42    }
43}
44
45/// Add `field` after the column or field `after`, or last when absent.
46#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
47pub struct AddColumn {
48    /// Contract field after.
49    #[serde(rename = "after")]
50    #[serde(default, skip_serializing_if = "Option::is_none")]
51    pub after: Option<Vec<String>>,
52    /// Contract field field.
53    #[serde(rename = "field")]
54    pub field: ArrowField,
55}
56impl<'de> DeserializeStrict<'de> for AddColumn {
57    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
58        #[derive(Deserialize)]
59        #[serde(deny_unknown_fields)]
60        struct __Wire {
61            #[serde(rename = "after")]
62            #[serde(default)]
63            after: Strict<Option<Vec<String>>>,
64            #[serde(rename = "field")]
65            field: Strict<ArrowField>,
66        }
67        let wire = __Wire::deserialize(deserializer)?;
68        Ok(Self {
69            after: wire.after.0,
70            field: wire.field.0,
71        })
72    }
73}
74
75/// A file written after `from`, with the rows `to` keeps in it. `appended` holds rows added after
76/// `from`, whose row IDs are past every row ID `from` allocated. `carried` holds rows of `from`
77/// that a rewrite, such as compaction, moved here. A carried row holds the values it held in
78/// `from`, unless it is also in `patched`: the carried rows whose requested columns a patch changed
79/// after `from`.
80#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
81pub struct AddedFragment {
82    /// Contract field appended.
83    #[serde(rename = "appended")]
84    pub appended: Vec<RowIdRange>,
85    /// Contract field carried.
86    #[serde(rename = "carried")]
87    pub carried: Vec<RowIdRange>,
88    /// Contract field patched.
89    #[serde(rename = "patched")]
90    pub patched: Vec<RowIdRange>,
91}
92impl<'de> DeserializeStrict<'de> for AddedFragment {
93    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
94        #[derive(Deserialize)]
95        #[serde(deny_unknown_fields)]
96        struct __Wire {
97            #[serde(rename = "appended")]
98            appended: Strict<Vec<RowIdRange>>,
99            #[serde(rename = "carried")]
100            carried: Strict<Vec<RowIdRange>>,
101            #[serde(rename = "patched")]
102            patched: Strict<Vec<RowIdRange>>,
103        }
104        let wire = __Wire::deserialize(deserializer)?;
105        Ok(Self {
106            appended: wire.appended.0,
107            carried: wire.carried.0,
108            patched: wire.patched.0,
109        })
110    }
111}
112
113/// Aggregates of the output rows: one row for each distinct value of the `groups` columns, or one
114/// row for all rows when there are none. Each row holds the group columns, each aggregate by name,
115/// `scandal.rows` (the rows the group covers, as `uint64`) and `scandal.other`. At most `maxGroups`
116/// groups are kept, 1,000 unless set and at most 100,000; rows of further groups fold into one row
117/// whose `scandal.other` is true and whose group columns are null. The result is exact while the
118/// version holds no more distinct groups than `maxGroups`. Merged results order groups by
119/// `scandal.rows`, largest first, then by their group values, with the folded row last.
120#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
121pub struct Aggregate {
122    /// Contract field aggregates.
123    #[serde(rename = "aggregates")]
124    pub aggregates: Vec<NamedAggregate>,
125    /// Contract field groups.
126    #[serde(rename = "groups")]
127    pub groups: Vec<String>,
128    /// Contract field maxGroups.
129    #[serde(rename = "maxGroups")]
130    #[serde(default, skip_serializing_if = "Option::is_none")]
131    pub max_groups: Option<u32>,
132}
133impl<'de> DeserializeStrict<'de> for Aggregate {
134    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
135        #[derive(Deserialize)]
136        #[serde(deny_unknown_fields)]
137        struct __Wire {
138            #[serde(rename = "aggregates")]
139            aggregates: Strict<Vec<NamedAggregate>>,
140            #[serde(rename = "groups")]
141            groups: Strict<Vec<String>>,
142            #[serde(rename = "maxGroups")]
143            #[serde(default)]
144            max_groups: Strict<Option<u32>>,
145        }
146        let wire = __Wire::deserialize(deserializer)?;
147        Ok(Self {
148            aggregates: wire.aggregates.0,
149            groups: wire.groups.0,
150            max_groups: wire.max_groups.0,
151        })
152    }
153}
154
155/// An aggregate whose partial results merge exactly. Each is a Vortex aggregate function, and its
156/// partial state, which a split returns, has the type of its result. `count` counts rows, or a
157/// column's non-null values, as `uint64` (`vortex.count`). `sum` adds a numeric or decimal column's
158/// values (`vortex.sum`): booleans and unsigned integers as `uint64`, signed integers as `int64`,
159/// floating point as `float64`, and decimals with ten more digits of precision. A sum of no values
160/// is zero, and an integer sum that overflows is null. `min` and `max` keep a column's least or
161/// greatest value, in its own type, and are null for a group without values (`vortex.min`,
162/// `vortex.max`). NaN counts as a value, makes a sum NaN, and is the min and max of any values that
163/// include it. `histogram` counts a numeric column's values in equal bins (`spql.agg.histogram`).
164#[derive(Clone, Debug, PartialEq)]
165pub enum AggregateFunction {
166    /// A known union arm.
167    Count(CountAggregate),
168    /// A known union arm.
169    Histogram(HistogramAggregate),
170    /// A known union arm.
171    Max(ColumnAggregate),
172    /// A known union arm.
173    Min(ColumnAggregate),
174    /// A known union arm.
175    Sum(ColumnAggregate),
176    /// An unknown discriminator and its complete wire object.
177    Unknown { tag: String, value: Value },
178}
179impl Serialize for AggregateFunction {
180    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
181        match self {
182            Self::Count(value) => {
183                let mut object = serde_json::Map::new();
184                object.insert("type".into(), Value::String("count".into()));
185                object.insert(
186                    "count".into(),
187                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
188                );
189                Value::Object(object).serialize(serializer)
190            }
191            Self::Histogram(value) => {
192                let mut object = serde_json::Map::new();
193                object.insert("type".into(), Value::String("histogram".into()));
194                object.insert(
195                    "histogram".into(),
196                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
197                );
198                Value::Object(object).serialize(serializer)
199            }
200            Self::Max(value) => {
201                let mut object = serde_json::Map::new();
202                object.insert("type".into(), Value::String("max".into()));
203                object.insert(
204                    "max".into(),
205                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
206                );
207                Value::Object(object).serialize(serializer)
208            }
209            Self::Min(value) => {
210                let mut object = serde_json::Map::new();
211                object.insert("type".into(), Value::String("min".into()));
212                object.insert(
213                    "min".into(),
214                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
215                );
216                Value::Object(object).serialize(serializer)
217            }
218            Self::Sum(value) => {
219                let mut object = serde_json::Map::new();
220                object.insert("type".into(), Value::String("sum".into()));
221                object.insert(
222                    "sum".into(),
223                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
224                );
225                Value::Object(object).serialize(serializer)
226            }
227            Self::Unknown { tag, value } => {
228                if value.get("type").and_then(Value::as_str) != Some(tag.as_str()) {
229                    return Err(serde::ser::Error::custom(
230                        "unknown union discriminator mismatch",
231                    ));
232                }
233                value.serialize(serializer)
234            }
235        }
236    }
237}
238impl<'de> Deserialize<'de> for AggregateFunction {
239    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
240        let value = Value::deserialize(deserializer)?;
241        let tag = value
242            .get("type")
243            .and_then(Value::as_str)
244            .ok_or_else(|| serde::de::Error::custom("union requires type"))?;
245        match tag {
246            "count" => Ok(Self::Count(
247                serde_json::from_value(
248                    value
249                        .get("count")
250                        .cloned()
251                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
252                )
253                .map_err(serde::de::Error::custom)?,
254            )),
255            "histogram" => Ok(Self::Histogram(
256                serde_json::from_value(
257                    value
258                        .get("histogram")
259                        .cloned()
260                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
261                )
262                .map_err(serde::de::Error::custom)?,
263            )),
264            "max" => Ok(Self::Max(
265                serde_json::from_value(
266                    value
267                        .get("max")
268                        .cloned()
269                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
270                )
271                .map_err(serde::de::Error::custom)?,
272            )),
273            "min" => Ok(Self::Min(
274                serde_json::from_value(
275                    value
276                        .get("min")
277                        .cloned()
278                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
279                )
280                .map_err(serde::de::Error::custom)?,
281            )),
282            "sum" => Ok(Self::Sum(
283                serde_json::from_value(
284                    value
285                        .get("sum")
286                        .cloned()
287                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
288                )
289                .map_err(serde::de::Error::custom)?,
290            )),
291            tag => Ok(Self::Unknown {
292                tag: tag.to_owned(),
293                value,
294            }),
295        }
296    }
297}
298impl<'de> DeserializeStrict<'de> for AggregateFunction {
299    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
300        #[derive(Deserialize)]
301        enum __Tag0 {
302            #[serde(rename = "count")]
303            Value,
304        }
305        #[derive(Deserialize)]
306        #[serde(deny_unknown_fields)]
307        struct __Arm0 {
308            #[serde(rename = "type")]
309            _tag: __Tag0,
310            #[serde(rename = "count")]
311            value: Strict<CountAggregate>,
312        }
313        #[derive(Deserialize)]
314        enum __Tag1 {
315            #[serde(rename = "histogram")]
316            Value,
317        }
318        #[derive(Deserialize)]
319        #[serde(deny_unknown_fields)]
320        struct __Arm1 {
321            #[serde(rename = "type")]
322            _tag: __Tag1,
323            #[serde(rename = "histogram")]
324            value: Strict<HistogramAggregate>,
325        }
326        #[derive(Deserialize)]
327        enum __Tag2 {
328            #[serde(rename = "max")]
329            Value,
330        }
331        #[derive(Deserialize)]
332        #[serde(deny_unknown_fields)]
333        struct __Arm2 {
334            #[serde(rename = "type")]
335            _tag: __Tag2,
336            #[serde(rename = "max")]
337            value: Strict<ColumnAggregate>,
338        }
339        #[derive(Deserialize)]
340        enum __Tag3 {
341            #[serde(rename = "min")]
342            Value,
343        }
344        #[derive(Deserialize)]
345        #[serde(deny_unknown_fields)]
346        struct __Arm3 {
347            #[serde(rename = "type")]
348            _tag: __Tag3,
349            #[serde(rename = "min")]
350            value: Strict<ColumnAggregate>,
351        }
352        #[derive(Deserialize)]
353        enum __Tag4 {
354            #[serde(rename = "sum")]
355            Value,
356        }
357        #[derive(Deserialize)]
358        #[serde(deny_unknown_fields)]
359        struct __Arm4 {
360            #[serde(rename = "type")]
361            _tag: __Tag4,
362            #[serde(rename = "sum")]
363            value: Strict<ColumnAggregate>,
364        }
365        #[derive(Deserialize)]
366        #[serde(untagged)]
367        enum __Known {
368            Count(Box<__Arm0>),
369            Histogram(Box<__Arm1>),
370            Max(Box<__Arm2>),
371            Min(Box<__Arm3>),
372            Sum(Box<__Arm4>),
373        }
374        Ok(match __Known::deserialize(deserializer)? {
375            __Known::Count(arm) => Self::Count(arm.value.0),
376            __Known::Histogram(arm) => Self::Histogram(arm.value.0),
377            __Known::Max(arm) => Self::Max(arm.value.0),
378            __Known::Min(arm) => Self::Min(arm.value.0),
379            __Known::Sum(arm) => Self::Sum(arm.value.0),
380        })
381    }
382}
383
384/// A version of a Table whose files mirror the files of `source`, a version of another Table: the
385/// successor of `versionId`, or the Table's first version, with `schema`, when `versionId` is
386/// absent. It takes the receipts of mirrored files and of patches to `versionId`'s rows. Finalizing
387/// removes each file whose source file `source` no longer has, and refuses a file that does not
388/// mirror a file of `source`.
389#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
390pub struct AlignedBase {
391    /// Contract field schema.
392    #[serde(rename = "schema")]
393    #[serde(default, skip_serializing_if = "Option::is_none")]
394    pub schema: Option<ArrowSchema>,
395    /// Contract field source.
396    #[serde(rename = "source")]
397    pub source: TableVersion,
398    /// Contract field sourceStorage.
399    #[serde(rename = "sourceStorage")]
400    #[serde(default, skip_serializing_if = "Option::is_none")]
401    pub source_storage: Option<StorageBinding>,
402    /// Contract field versionId.
403    #[serde(rename = "versionId")]
404    #[serde(default, skip_serializing_if = "Option::is_none")]
405    pub version_id: Option<Uuid>,
406}
407impl<'de> DeserializeStrict<'de> for AlignedBase {
408    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
409        #[derive(Deserialize)]
410        #[serde(deny_unknown_fields)]
411        struct __Wire {
412            #[serde(rename = "schema")]
413            #[serde(default)]
414            schema: Strict<Option<ArrowSchema>>,
415            #[serde(rename = "source")]
416            source: Strict<TableVersion>,
417            #[serde(rename = "sourceStorage")]
418            #[serde(default)]
419            source_storage: Strict<Option<StorageBinding>>,
420            #[serde(rename = "versionId")]
421            #[serde(default)]
422            version_id: Strict<Option<Uuid>>,
423        }
424        let wire = __Wire::deserialize(deserializer)?;
425        Ok(Self {
426            schema: wire.schema.0,
427            source: wire.source.0,
428            source_storage: wire.source_storage.0,
429            version_id: wire.version_id.0,
430        })
431    }
432}
433
434/// The receipt of a mirrored file, to finalize on an `aligned` base.
435#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
436pub struct AlignedFragment {
437    /// Contract field receipt.
438    #[serde(rename = "receipt")]
439    pub receipt: FragmentReceipt,
440}
441impl<'de> DeserializeStrict<'de> for AlignedFragment {
442    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
443        #[derive(Deserialize)]
444        #[serde(deny_unknown_fields)]
445        struct __Wire {
446            #[serde(rename = "receipt")]
447            receipt: Strict<FragmentReceipt>,
448        }
449        let wire = __Wire::deserialize(deserializer)?;
450        Ok(Self {
451            receipt: wire.receipt.0,
452        })
453    }
454}
455
456/// The Table to append to; the version the rows extend, absent for a new Table; and the write
457/// attempt whose directory, `attempts/<attempt>/payloads/`, the rows' files go under. Without an
458/// attempt the files go under `data/`, which only a binding that names no part of a write may
459/// create. The rows have the Table's schema after `schemaChanges` apply to `base`; every request of
460/// one edit carries the same changes, and its receipts finalize on an `edit` base.
461#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
462pub struct AppendRowsRequest {
463    /// Contract field attempt.
464    #[serde(rename = "attempt")]
465    #[serde(default, skip_serializing_if = "Option::is_none")]
466    pub attempt: Option<Uuid>,
467    /// Contract field base.
468    #[serde(rename = "base")]
469    #[serde(default, skip_serializing_if = "Option::is_none")]
470    pub base: Option<Uuid>,
471    /// Contract field properties.
472    #[serde(rename = "properties")]
473    #[serde(default, skip_serializing_if = "Option::is_none")]
474    pub properties: Option<WriteProperties>,
475    /// Contract field schemaChanges.
476    #[serde(rename = "schemaChanges")]
477    #[serde(default, skip_serializing_if = "Option::is_none")]
478    pub schema_changes: Option<Vec<SchemaChange>>,
479    /// Contract field table.
480    #[serde(rename = "table")]
481    pub table: TableBinding,
482}
483impl<'de> DeserializeStrict<'de> for AppendRowsRequest {
484    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
485        #[derive(Deserialize)]
486        #[serde(deny_unknown_fields)]
487        struct __Wire {
488            #[serde(rename = "attempt")]
489            #[serde(default)]
490            attempt: Strict<Option<Uuid>>,
491            #[serde(rename = "base")]
492            #[serde(default)]
493            base: Strict<Option<Uuid>>,
494            #[serde(rename = "properties")]
495            #[serde(default)]
496            properties: Strict<Option<WriteProperties>>,
497            #[serde(rename = "schemaChanges")]
498            #[serde(default)]
499            schema_changes: Strict<Option<Vec<SchemaChange>>>,
500            #[serde(rename = "table")]
501            table: Strict<TableBinding>,
502        }
503        let wire = __Wire::deserialize(deserializer)?;
504        Ok(Self {
505            attempt: wire.attempt.0,
506            base: wire.base.0,
507            properties: wire.properties.0,
508            schema_changes: wire.schema_changes.0,
509            table: wire.table.0,
510        })
511    }
512}
513
514/// AppendedFragments contract value.
515#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
516pub struct AppendedFragments {
517    /// Contract field receipts.
518    #[serde(rename = "receipts")]
519    pub receipts: Vec<FragmentReceipt>,
520}
521impl<'de> DeserializeStrict<'de> for AppendedFragments {
522    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
523        #[derive(Deserialize)]
524        #[serde(deny_unknown_fields)]
525        struct __Wire {
526            #[serde(rename = "receipts")]
527            receipts: Strict<Vec<FragmentReceipt>>,
528        }
529        let wire = __Wire::deserialize(deserializer)?;
530        Ok(Self {
531            receipts: wire.receipts.0,
532        })
533    }
534}
535
536/// An Arrow data type in the JSON form of the Rust `arrow-schema` crate.
537#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
538#[serde(transparent)]
539pub struct ArrowDataType(pub Value);
540impl<'de> DeserializeStrict<'de> for ArrowDataType {
541    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
542        Ok(Self(Strict::<Value>::deserialize(deserializer)?.0))
543    }
544}
545
546/// One Arrow field in the JSON form of the Rust `arrow-schema` crate: `name`, `data_type`,
547/// `nullable`, `dict_id`, `dict_is_ordered` and `metadata`.
548#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
549#[serde(transparent)]
550pub struct ArrowField(pub Value);
551impl<'de> DeserializeStrict<'de> for ArrowField {
552    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
553        Ok(Self(Strict::<Value>::deserialize(deserializer)?.0))
554    }
555}
556
557/// An Arrow schema in the JSON form of the Rust `arrow-schema` crate: `fields` and `metadata`,
558/// where each field has `name`, `data_type`, `nullable`, `dict_id`, `dict_is_ordered` and
559/// `metadata`. Bind results, projected scan plans and execution outputs can attach a versioned JSON
560/// plan description under the reserved metadata key `spiral.execution.plan`. This describes
561/// execution rather than row types. A missing executionId denotes a preview; an execution reports
562/// its actual physicalId and executionId. Literal payloads are omitted. Evaluate input schemas may
563/// opt into aggregate profiling with `spiral.execution.options` metadata (profile, optional opaque
564/// caller and partition). Projected scans use execution options independently of collectMetrics.
565/// Execution descriptions then include a profile keyed by physical node IDs. Fixed-schema Arrow
566/// responses preserve updates in a trailing `scandal.execution` dictionary column tagged by
567/// `spiral.execution.frame`; adapters restore plan metadata and strip this framing before exposing
568/// row columns. Empty batches can carry terminal or partial reports.
569#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
570#[serde(transparent)]
571pub struct ArrowSchema(pub Value);
572impl<'de> DeserializeStrict<'de> for ArrowSchema {
573    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
574        Ok(Self(Strict::<Value>::deserialize(deserializer)?.0))
575    }
576}
577
578/// Values for the columns that `schemaChanges` adds, for every row that file `fragmentId` of
579/// version `base` keeps, in stored order. The service checks their count, places them at the kept
580/// positions, writes nulls at the positions `base` deletes, and writes them as column files
581/// attached to the file, to prepare on an `edit` base of `base`. The file's existing files are not
582/// rewritten. Files go under `attempt`'s directory.
583#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
584pub struct AttachColumnsRequest {
585    /// Contract field attempt.
586    #[serde(rename = "attempt")]
587    #[serde(default, skip_serializing_if = "Option::is_none")]
588    pub attempt: Option<Uuid>,
589    /// Contract field base.
590    #[serde(rename = "base")]
591    pub base: Uuid,
592    /// Contract field fragmentId.
593    #[serde(rename = "fragmentId")]
594    pub fragment_id: Uuid,
595    /// Contract field schemaChanges.
596    #[serde(rename = "schemaChanges")]
597    #[serde(default, skip_serializing_if = "Option::is_none")]
598    pub schema_changes: Option<Vec<SchemaChange>>,
599    /// Contract field table.
600    #[serde(rename = "table")]
601    pub table: TableBinding,
602}
603impl<'de> DeserializeStrict<'de> for AttachColumnsRequest {
604    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
605        #[derive(Deserialize)]
606        #[serde(deny_unknown_fields)]
607        struct __Wire {
608            #[serde(rename = "attempt")]
609            #[serde(default)]
610            attempt: Strict<Option<Uuid>>,
611            #[serde(rename = "base")]
612            base: Strict<Uuid>,
613            #[serde(rename = "fragmentId")]
614            fragment_id: Strict<Uuid>,
615            #[serde(rename = "schemaChanges")]
616            #[serde(default)]
617            schema_changes: Strict<Option<Vec<SchemaChange>>>,
618            #[serde(rename = "table")]
619            table: Strict<TableBinding>,
620        }
621        let wire = __Wire::deserialize(deserializer)?;
622        Ok(Self {
623            attempt: wire.attempt.0,
624            base: wire.base.0,
625            fragment_id: wire.fragment_id.0,
626            schema_changes: wire.schema_changes.0,
627            table: wire.table.0,
628        })
629    }
630}
631
632/// The receipt of an attachment of column files, to finalize.
633#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
634pub struct AttachedColumns {
635    /// Contract field receipt.
636    #[serde(rename = "receipt")]
637    pub receipt: FragmentReceipt,
638}
639impl<'de> DeserializeStrict<'de> for AttachedColumns {
640    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
641        #[derive(Deserialize)]
642        #[serde(deny_unknown_fields)]
643        struct __Wire {
644            #[serde(rename = "receipt")]
645            receipt: Strict<FragmentReceipt>,
646        }
647        let wire = __Wire::deserialize(deserializer)?;
648        Ok(Self {
649            receipt: wire.receipt.0,
650        })
651    }
652}
653
654/// BindProjectionRequest contract value.
655#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
656pub struct BindProjectionRequest {
657    /// Contract field input.
658    #[serde(rename = "input")]
659    pub input: ArrowSchema,
660    /// Contract field projection.
661    #[serde(rename = "projection")]
662    pub projection: Vec<NamedExpression>,
663}
664impl<'de> DeserializeStrict<'de> for BindProjectionRequest {
665    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
666        #[derive(Deserialize)]
667        #[serde(deny_unknown_fields)]
668        struct __Wire {
669            #[serde(rename = "input")]
670            input: Strict<ArrowSchema>,
671            #[serde(rename = "projection")]
672            projection: Strict<Vec<NamedExpression>>,
673        }
674        let wire = __Wire::deserialize(deserializer)?;
675        Ok(Self {
676            input: wire.input.0,
677            projection: wire.projection.0,
678        })
679    }
680}
681
682/// A reference to a payload that one Table owns. It is never a download URL. `digest` is the BLAKE3
683/// digest of the whole payload, as lowercase hexadecimal. The payload is the object
684/// `blobs/<objectId>` under the Table's root, or `attempts/<attempt>/blobs/<objectId>` when an
685/// upload into a write attempt stored it.
686#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
687pub struct Blob {
688    /// Contract field attempt.
689    #[serde(rename = "attempt")]
690    #[serde(default, skip_serializing_if = "Option::is_none")]
691    pub attempt: Option<Uuid>,
692    /// Contract field digest.
693    #[serde(rename = "digest")]
694    pub digest: String,
695    /// Contract field mediaType.
696    #[serde(rename = "mediaType")]
697    pub media_type: String,
698    /// Contract field objectId.
699    #[serde(rename = "objectId")]
700    pub object_id: Uuid,
701    /// Contract field size.
702    #[serde(rename = "size")]
703    pub size: SafeUnsignedLong,
704    /// Contract field tableId.
705    #[serde(rename = "tableId")]
706    pub table_id: Uuid,
707}
708impl<'de> DeserializeStrict<'de> for Blob {
709    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
710        #[derive(Deserialize)]
711        #[serde(deny_unknown_fields)]
712        struct __Wire {
713            #[serde(rename = "attempt")]
714            #[serde(default)]
715            attempt: Strict<Option<Uuid>>,
716            #[serde(rename = "digest")]
717            digest: Strict<String>,
718            #[serde(rename = "mediaType")]
719            media_type: Strict<String>,
720            #[serde(rename = "objectId")]
721            object_id: Strict<Uuid>,
722            #[serde(rename = "size")]
723            size: Strict<SafeUnsignedLong>,
724            #[serde(rename = "tableId")]
725            table_id: Strict<Uuid>,
726        }
727        let wire = __Wire::deserialize(deserializer)?;
728        Ok(Self {
729            attempt: wire.attempt.0,
730            digest: wire.digest.0,
731            media_type: wire.media_type.0,
732            object_id: wire.object_id.0,
733            size: wire.size.0,
734            table_id: wire.table_id.0,
735        })
736    }
737}
738
739/// A stored part of an upload. Pass it unchanged to complete the upload. `hash` is the BLAKE3
740/// chaining value of the part's subtree of the payload, as lowercase hexadecimal. Part 1 also
741/// carries its own `digest`, the payload's digest when it is the only part.
742#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
743pub struct BlobPart {
744    /// Contract field digest.
745    #[serde(rename = "digest")]
746    #[serde(default, skip_serializing_if = "Option::is_none")]
747    pub digest: Option<String>,
748    /// Contract field hash.
749    #[serde(rename = "hash")]
750    pub hash: String,
751    /// Contract field part.
752    #[serde(rename = "part")]
753    pub part: u32,
754    /// Contract field size.
755    #[serde(rename = "size")]
756    pub size: SafeUnsignedLong,
757    /// Contract field tag.
758    #[serde(rename = "tag")]
759    pub tag: String,
760}
761impl<'de> DeserializeStrict<'de> for BlobPart {
762    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
763        #[derive(Deserialize)]
764        #[serde(deny_unknown_fields)]
765        struct __Wire {
766            #[serde(rename = "digest")]
767            #[serde(default)]
768            digest: Strict<Option<String>>,
769            #[serde(rename = "hash")]
770            hash: Strict<String>,
771            #[serde(rename = "part")]
772            part: Strict<u32>,
773            #[serde(rename = "size")]
774            size: Strict<SafeUnsignedLong>,
775            #[serde(rename = "tag")]
776            tag: Strict<String>,
777        }
778        let wire = __Wire::deserialize(deserializer)?;
779        Ok(Self {
780            digest: wire.digest.0,
781            hash: wire.hash.0,
782            part: wire.part.0,
783            size: wire.size.0,
784            tag: wire.tag.0,
785        })
786    }
787}
788
789/// What storage holds for a blob.
790#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
791pub struct BlobStat {
792    /// Contract field etag.
793    #[serde(rename = "etag")]
794    #[serde(default, skip_serializing_if = "Option::is_none")]
795    pub etag: Option<String>,
796    /// Contract field size.
797    #[serde(rename = "size")]
798    pub size: SafeUnsignedLong,
799    /// Contract field version.
800    #[serde(rename = "version")]
801    #[serde(default, skip_serializing_if = "Option::is_none")]
802    pub version: Option<String>,
803}
804impl<'de> DeserializeStrict<'de> for BlobStat {
805    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
806        #[derive(Deserialize)]
807        #[serde(deny_unknown_fields)]
808        struct __Wire {
809            #[serde(rename = "etag")]
810            #[serde(default)]
811            etag: Strict<Option<String>>,
812            #[serde(rename = "size")]
813            size: Strict<SafeUnsignedLong>,
814            #[serde(rename = "version")]
815            #[serde(default)]
816            version: Strict<Option<String>>,
817        }
818        let wire = __Wire::deserialize(deserializer)?;
819        Ok(Self {
820            etag: wire.etag.0,
821            size: wire.size.0,
822            version: wire.version.0,
823        })
824    }
825}
826
827/// A multipart upload of one blob into a write attempt, at `attempts/<attempt>/blobs/<objectId>`
828/// under the Table's root. The client keeps it and sends it with each part and with its completion;
829/// the storage provider keeps the upload's progress, so any instance serves any step. Every part
830/// but the last holds exactly `partBytes`, a power of two.
831#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
832pub struct BlobUpload {
833    /// Contract field attempt.
834    #[serde(rename = "attempt")]
835    pub attempt: Uuid,
836    /// Contract field mediaType.
837    #[serde(rename = "mediaType")]
838    pub media_type: String,
839    /// Contract field objectId.
840    #[serde(rename = "objectId")]
841    pub object_id: Uuid,
842    /// Contract field partBytes.
843    #[serde(rename = "partBytes")]
844    pub part_bytes: SafeUnsignedLong,
845    /// Contract field tableId.
846    #[serde(rename = "tableId")]
847    pub table_id: Uuid,
848    /// Contract field uploadId.
849    #[serde(rename = "uploadId")]
850    pub upload_id: String,
851}
852impl<'de> DeserializeStrict<'de> for BlobUpload {
853    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
854        #[derive(Deserialize)]
855        #[serde(deny_unknown_fields)]
856        struct __Wire {
857            #[serde(rename = "attempt")]
858            attempt: Strict<Uuid>,
859            #[serde(rename = "mediaType")]
860            media_type: Strict<String>,
861            #[serde(rename = "objectId")]
862            object_id: Strict<Uuid>,
863            #[serde(rename = "partBytes")]
864            part_bytes: Strict<SafeUnsignedLong>,
865            #[serde(rename = "tableId")]
866            table_id: Strict<Uuid>,
867            #[serde(rename = "uploadId")]
868            upload_id: Strict<String>,
869        }
870        let wire = __Wire::deserialize(deserializer)?;
871        Ok(Self {
872            attempt: wire.attempt.0,
873            media_type: wire.media_type.0,
874            object_id: wire.object_id.0,
875            part_bytes: wire.part_bytes.0,
876            table_id: wire.table_id.0,
877            upload_id: wire.upload_id.0,
878        })
879    }
880}
881
882/// Bytes `start..end` of a payload.
883#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
884pub struct ByteRange {
885    /// Contract field end.
886    #[serde(rename = "end")]
887    pub end: SafeUnsignedLong,
888    /// Contract field start.
889    #[serde(rename = "start")]
890    pub start: SafeUnsignedLong,
891}
892impl<'de> DeserializeStrict<'de> for ByteRange {
893    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
894        #[derive(Deserialize)]
895        #[serde(deny_unknown_fields)]
896        struct __Wire {
897            #[serde(rename = "end")]
898            end: Strict<SafeUnsignedLong>,
899            #[serde(rename = "start")]
900            start: Strict<SafeUnsignedLong>,
901        }
902        let wire = __Wire::deserialize(deserializer)?;
903        Ok(Self {
904            end: wire.end.0,
905            start: wire.start.0,
906        })
907    }
908}
909
910/// How version `to` of a Table changed since version `from`. `fragments` has one entry for each
911/// file of `to`, in stored order. `removedFragmentIds` names the files of `from` that `to` no
912/// longer has; each of their rows was deleted or carried into an added file. `retypedColumns` names
913/// the requested columns whose type differs from their type in `from`, including columns that
914/// `from` lacks. Each set of row IDs is sorted, disjoint ranges.
915#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
916pub struct ChangePlan {
917    /// Contract field fragments.
918    #[serde(rename = "fragments")]
919    pub fragments: Vec<FragmentChange>,
920    /// Contract field removedFragmentIds.
921    #[serde(rename = "removedFragmentIds")]
922    pub removed_fragment_ids: Vec<Uuid>,
923    /// Contract field retypedColumns.
924    #[serde(rename = "retypedColumns")]
925    pub retyped_columns: Vec<String>,
926}
927impl<'de> DeserializeStrict<'de> for ChangePlan {
928    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
929        #[derive(Deserialize)]
930        #[serde(deny_unknown_fields)]
931        struct __Wire {
932            #[serde(rename = "fragments")]
933            fragments: Strict<Vec<FragmentChange>>,
934            #[serde(rename = "removedFragmentIds")]
935            removed_fragment_ids: Strict<Vec<Uuid>>,
936            #[serde(rename = "retypedColumns")]
937            retyped_columns: Strict<Vec<String>>,
938        }
939        let wire = __Wire::deserialize(deserializer)?;
940        Ok(Self {
941            fragments: wire.fragments.0,
942            removed_fragment_ids: wire.removed_fragment_ids.0,
943            retyped_columns: wire.retyped_columns.0,
944        })
945    }
946}
947
948/// An aggregate of one output column.
949#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
950pub struct ColumnAggregate {
951    /// Contract field column.
952    #[serde(rename = "column")]
953    pub column: String,
954}
955impl<'de> DeserializeStrict<'de> for ColumnAggregate {
956    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
957        #[derive(Deserialize)]
958        #[serde(deny_unknown_fields)]
959        struct __Wire {
960            #[serde(rename = "column")]
961            column: Strict<String>,
962        }
963        let wire = __Wire::deserialize(deserializer)?;
964        Ok(Self {
965            column: wire.column.0,
966        })
967    }
968}
969
970/// A top-level column, or a nested field by its segments.
971#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
972pub struct ColumnPath {
973    /// Contract field path.
974    #[serde(rename = "path")]
975    pub path: Vec<String>,
976}
977impl<'de> DeserializeStrict<'de> for ColumnPath {
978    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
979        #[derive(Deserialize)]
980        #[serde(deny_unknown_fields)]
981        struct __Wire {
982            #[serde(rename = "path")]
983            path: Strict<Vec<String>>,
984        }
985        let wire = __Wire::deserialize(deserializer)?;
986        Ok(Self { path: wire.path.0 })
987    }
988}
989
990/// Stored bounds and counts for one output column. Values are typed literal expressions; missing
991/// values are unknown.
992#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
993pub struct ColumnStatistics {
994    /// Contract field countsExact.
995    #[serde(rename = "countsExact")]
996    pub counts_exact: bool,
997    /// Contract field maxExact.
998    #[serde(rename = "maxExact")]
999    pub max_exact: bool,
1000    /// Contract field maxValue.
1001    #[serde(rename = "maxValue")]
1002    #[serde(default, skip_serializing_if = "Option::is_none")]
1003    pub max_value: Option<Expression>,
1004    /// Contract field minExact.
1005    #[serde(rename = "minExact")]
1006    pub min_exact: bool,
1007    /// Contract field minValue.
1008    #[serde(rename = "minValue")]
1009    #[serde(default, skip_serializing_if = "Option::is_none")]
1010    pub min_value: Option<Expression>,
1011    /// Contract field name.
1012    #[serde(rename = "name")]
1013    pub name: String,
1014    /// Contract field nanCount.
1015    #[serde(rename = "nanCount")]
1016    #[serde(default, skip_serializing_if = "Option::is_none")]
1017    pub nan_count: Option<SafeUnsignedLong>,
1018    /// Contract field nullCount.
1019    #[serde(rename = "nullCount")]
1020    #[serde(default, skip_serializing_if = "Option::is_none")]
1021    pub null_count: Option<SafeUnsignedLong>,
1022}
1023impl<'de> DeserializeStrict<'de> for ColumnStatistics {
1024    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1025        #[derive(Deserialize)]
1026        #[serde(deny_unknown_fields)]
1027        struct __Wire {
1028            #[serde(rename = "countsExact")]
1029            counts_exact: Strict<bool>,
1030            #[serde(rename = "maxExact")]
1031            max_exact: Strict<bool>,
1032            #[serde(rename = "maxValue")]
1033            #[serde(default)]
1034            max_value: Strict<Option<Expression>>,
1035            #[serde(rename = "minExact")]
1036            min_exact: Strict<bool>,
1037            #[serde(rename = "minValue")]
1038            #[serde(default)]
1039            min_value: Strict<Option<Expression>>,
1040            #[serde(rename = "name")]
1041            name: Strict<String>,
1042            #[serde(rename = "nanCount")]
1043            #[serde(default)]
1044            nan_count: Strict<Option<SafeUnsignedLong>>,
1045            #[serde(rename = "nullCount")]
1046            #[serde(default)]
1047            null_count: Strict<Option<SafeUnsignedLong>>,
1048        }
1049        let wire = __Wire::deserialize(deserializer)?;
1050        Ok(Self {
1051            counts_exact: wire.counts_exact.0,
1052            max_exact: wire.max_exact.0,
1053            max_value: wire.max_value.0,
1054            min_exact: wire.min_exact.0,
1055            min_value: wire.min_value.0,
1056            name: wire.name.0,
1057            nan_count: wire.nan_count.0,
1058            null_count: wire.null_count.0,
1059        })
1060    }
1061}
1062
1063/// Every part of an upload, in order from part 1.
1064#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1065pub struct CompleteBlobUploadRequest {
1066    /// Contract field parts.
1067    #[serde(rename = "parts")]
1068    pub parts: Vec<BlobPart>,
1069    /// Contract field storage.
1070    #[serde(rename = "storage")]
1071    #[serde(default, skip_serializing_if = "Option::is_none")]
1072    pub storage: Option<StorageBinding>,
1073    /// Contract field upload.
1074    #[serde(rename = "upload")]
1075    pub upload: BlobUpload,
1076}
1077impl<'de> DeserializeStrict<'de> for CompleteBlobUploadRequest {
1078    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1079        #[derive(Deserialize)]
1080        #[serde(deny_unknown_fields)]
1081        struct __Wire {
1082            #[serde(rename = "parts")]
1083            parts: Strict<Vec<BlobPart>>,
1084            #[serde(rename = "storage")]
1085            #[serde(default)]
1086            storage: Strict<Option<StorageBinding>>,
1087            #[serde(rename = "upload")]
1088            upload: Strict<BlobUpload>,
1089        }
1090        let wire = __Wire::deserialize(deserializer)?;
1091        Ok(Self {
1092            parts: wire.parts.0,
1093            storage: wire.storage.0,
1094            upload: wire.upload.0,
1095        })
1096    }
1097}
1098
1099/// Counts rows, or the non-null values of `column` when it is set.
1100#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1101pub struct CountAggregate {
1102    /// Contract field column.
1103    #[serde(rename = "column")]
1104    #[serde(default, skip_serializing_if = "Option::is_none")]
1105    pub column: Option<String>,
1106}
1107impl<'de> DeserializeStrict<'de> for CountAggregate {
1108    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1109        #[derive(Deserialize)]
1110        #[serde(deny_unknown_fields)]
1111        struct __Wire {
1112            #[serde(rename = "column")]
1113            #[serde(default)]
1114            column: Strict<Option<String>>,
1115        }
1116        let wire = __Wire::deserialize(deserializer)?;
1117        Ok(Self {
1118            column: wire.column.0,
1119        })
1120    }
1121}
1122
1123/// Delete visible rows matching the exact predicate, or all visible rows without one. Deletion
1124/// files use the attempt's storage binding; version metadata uses the finalization request's
1125/// publication binding. Both bindings must name the same root.
1126#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1127pub struct DeleteBase {
1128    /// Contract field attempt.
1129    #[serde(rename = "attempt")]
1130    pub attempt: Uuid,
1131    /// Contract field expectedRows.
1132    #[serde(rename = "expectedRows")]
1133    pub expected_rows: SafeUnsignedLong,
1134    /// Contract field filter.
1135    #[serde(rename = "filter")]
1136    #[serde(default, skip_serializing_if = "Option::is_none")]
1137    pub filter: Option<Expression>,
1138    /// Contract field storage.
1139    #[serde(rename = "storage")]
1140    #[serde(default, skip_serializing_if = "Option::is_none")]
1141    pub storage: Option<StorageBinding>,
1142    /// Contract field versionId.
1143    #[serde(rename = "versionId")]
1144    pub version_id: Uuid,
1145}
1146impl<'de> DeserializeStrict<'de> for DeleteBase {
1147    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1148        #[derive(Deserialize)]
1149        #[serde(deny_unknown_fields)]
1150        struct __Wire {
1151            #[serde(rename = "attempt")]
1152            attempt: Strict<Uuid>,
1153            #[serde(rename = "expectedRows")]
1154            expected_rows: Strict<SafeUnsignedLong>,
1155            #[serde(rename = "filter")]
1156            #[serde(default)]
1157            filter: Strict<Option<Expression>>,
1158            #[serde(rename = "storage")]
1159            #[serde(default)]
1160            storage: Strict<Option<StorageBinding>>,
1161            #[serde(rename = "versionId")]
1162            version_id: Strict<Uuid>,
1163        }
1164        let wire = __Wire::deserialize(deserializer)?;
1165        Ok(Self {
1166            attempt: wire.attempt.0,
1167            expected_rows: wire.expected_rows.0,
1168            filter: wire.filter.0,
1169            storage: wire.storage.0,
1170            version_id: wire.version_id.0,
1171        })
1172    }
1173}
1174
1175/// The Table whose rows to delete, the version they belong to, and the write attempt whose
1176/// directory the deletion files go under. The Arrow rows hold only `rowIdColumn`, a `uint64` column
1177/// of the row IDs to delete; each must be visible in `base`.
1178#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1179pub struct DeleteRowsRequest {
1180    /// Contract field attempt.
1181    #[serde(rename = "attempt")]
1182    #[serde(default, skip_serializing_if = "Option::is_none")]
1183    pub attempt: Option<Uuid>,
1184    /// Contract field base.
1185    #[serde(rename = "base")]
1186    pub base: Uuid,
1187    /// Contract field rowIdColumn.
1188    #[serde(rename = "rowIdColumn")]
1189    pub row_id_column: String,
1190    /// Contract field table.
1191    #[serde(rename = "table")]
1192    pub table: TableBinding,
1193}
1194impl<'de> DeserializeStrict<'de> for DeleteRowsRequest {
1195    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1196        #[derive(Deserialize)]
1197        #[serde(deny_unknown_fields)]
1198        struct __Wire {
1199            #[serde(rename = "attempt")]
1200            #[serde(default)]
1201            attempt: Strict<Option<Uuid>>,
1202            #[serde(rename = "base")]
1203            base: Strict<Uuid>,
1204            #[serde(rename = "rowIdColumn")]
1205            row_id_column: Strict<String>,
1206            #[serde(rename = "table")]
1207            table: Strict<TableBinding>,
1208        }
1209        let wire = __Wire::deserialize(deserializer)?;
1210        Ok(Self {
1211            attempt: wire.attempt.0,
1212            base: wire.base.0,
1213            row_id_column: wire.row_id_column.0,
1214            table: wire.table.0,
1215        })
1216    }
1217}
1218
1219/// A read-only provider credential for a signed binding's storage: the `s3://` or `gs://` root
1220/// where the binding's root lives at its provider, and the provider session as JSON.
1221#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1222pub struct DirectRead {
1223    /// Contract field credential.
1224    #[serde(rename = "credential")]
1225    pub credential: StorageCredential,
1226    /// Contract field rootUri.
1227    #[serde(rename = "rootUri")]
1228    pub root_uri: String,
1229}
1230impl<'de> DeserializeStrict<'de> for DirectRead {
1231    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1232        #[derive(Deserialize)]
1233        #[serde(deny_unknown_fields)]
1234        struct __Wire {
1235            #[serde(rename = "credential")]
1236            credential: Strict<StorageCredential>,
1237            #[serde(rename = "rootUri")]
1238            root_uri: Strict<String>,
1239        }
1240        let wire = __Wire::deserialize(deserializer)?;
1241        Ok(Self {
1242            credential: wire.credential.0,
1243            root_uri: wire.root_uri.0,
1244        })
1245    }
1246}
1247
1248/// A successor of `versionId` built from the receipts of appends, patches, deleted rows and column
1249/// files, after `schemaChanges` apply to its schema. Every request that wrote one of its receipts
1250/// carried the same `schemaChanges`. Finalizing refuses a row both changed and deleted, a cell
1251/// changed twice, and a column written twice for one file.
1252#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1253pub struct EditBase {
1254    /// Contract field schemaChanges.
1255    #[serde(rename = "schemaChanges")]
1256    #[serde(default, skip_serializing_if = "Option::is_none")]
1257    pub schema_changes: Option<Vec<SchemaChange>>,
1258    /// Contract field versionId.
1259    #[serde(rename = "versionId")]
1260    pub version_id: Uuid,
1261}
1262impl<'de> DeserializeStrict<'de> for EditBase {
1263    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1264        #[derive(Deserialize)]
1265        #[serde(deny_unknown_fields)]
1266        struct __Wire {
1267            #[serde(rename = "schemaChanges")]
1268            #[serde(default)]
1269            schema_changes: Strict<Option<Vec<SchemaChange>>>,
1270            #[serde(rename = "versionId")]
1271            version_id: Strict<Uuid>,
1272        }
1273        let wire = __Wire::deserialize(deserializer)?;
1274        Ok(Self {
1275            schema_changes: wire.schema_changes.0,
1276            version_id: wire.version_id.0,
1277        })
1278    }
1279}
1280
1281/// What each split of a scan returns in place of its output rows: a top-k or aggregates. Each split
1282/// returns partial results; merging every split's results with the same emit gives the scan's
1283/// result, which the SDKs do. A split's results are complete only at the end of its stream, so a
1284/// failed split is read again from its start. A scan with an emit takes no `limit`.
1285#[derive(Clone, Debug, PartialEq)]
1286pub enum Emit {
1287    /// A known union arm.
1288    Aggregate(Aggregate),
1289    /// A known union arm.
1290    TopK(TopK),
1291    /// An unknown discriminator and its complete wire object.
1292    Unknown { tag: String, value: Value },
1293}
1294impl Serialize for Emit {
1295    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1296        match self {
1297            Self::Aggregate(value) => {
1298                let mut object = serde_json::Map::new();
1299                object.insert("type".into(), Value::String("aggregate".into()));
1300                object.insert(
1301                    "aggregate".into(),
1302                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
1303                );
1304                Value::Object(object).serialize(serializer)
1305            }
1306            Self::TopK(value) => {
1307                let mut object = serde_json::Map::new();
1308                object.insert("type".into(), Value::String("topK".into()));
1309                object.insert(
1310                    "topK".into(),
1311                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
1312                );
1313                Value::Object(object).serialize(serializer)
1314            }
1315            Self::Unknown { tag, value } => {
1316                if value.get("type").and_then(Value::as_str) != Some(tag.as_str()) {
1317                    return Err(serde::ser::Error::custom(
1318                        "unknown union discriminator mismatch",
1319                    ));
1320                }
1321                value.serialize(serializer)
1322            }
1323        }
1324    }
1325}
1326impl<'de> Deserialize<'de> for Emit {
1327    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1328        let value = Value::deserialize(deserializer)?;
1329        let tag = value
1330            .get("type")
1331            .and_then(Value::as_str)
1332            .ok_or_else(|| serde::de::Error::custom("union requires type"))?;
1333        match tag {
1334            "aggregate" => Ok(Self::Aggregate(
1335                serde_json::from_value(
1336                    value
1337                        .get("aggregate")
1338                        .cloned()
1339                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
1340                )
1341                .map_err(serde::de::Error::custom)?,
1342            )),
1343            "topK" => Ok(Self::TopK(
1344                serde_json::from_value(
1345                    value
1346                        .get("topK")
1347                        .cloned()
1348                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
1349                )
1350                .map_err(serde::de::Error::custom)?,
1351            )),
1352            tag => Ok(Self::Unknown {
1353                tag: tag.to_owned(),
1354                value,
1355            }),
1356        }
1357    }
1358}
1359impl<'de> DeserializeStrict<'de> for Emit {
1360    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1361        #[derive(Deserialize)]
1362        enum __Tag0 {
1363            #[serde(rename = "aggregate")]
1364            Value,
1365        }
1366        #[derive(Deserialize)]
1367        #[serde(deny_unknown_fields)]
1368        struct __Arm0 {
1369            #[serde(rename = "type")]
1370            _tag: __Tag0,
1371            #[serde(rename = "aggregate")]
1372            value: Strict<Aggregate>,
1373        }
1374        #[derive(Deserialize)]
1375        enum __Tag1 {
1376            #[serde(rename = "topK")]
1377            Value,
1378        }
1379        #[derive(Deserialize)]
1380        #[serde(deny_unknown_fields)]
1381        struct __Arm1 {
1382            #[serde(rename = "type")]
1383            _tag: __Tag1,
1384            #[serde(rename = "topK")]
1385            value: Strict<TopK>,
1386        }
1387        #[derive(Deserialize)]
1388        #[serde(untagged)]
1389        enum __Known {
1390            Aggregate(Box<__Arm0>),
1391            TopK(Box<__Arm1>),
1392        }
1393        Ok(match __Known::deserialize(deserializer)? {
1394            __Known::Aggregate(arm) => Self::Aggregate(arm.value.0),
1395            __Known::TopK(arm) => Self::TopK(arm.value.0),
1396        })
1397    }
1398}
1399
1400/// Named expressions to evaluate, and the Tables whose blobs they may read.
1401#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1402pub struct EvaluateRequest {
1403    /// Contract field projection.
1404    #[serde(rename = "projection")]
1405    pub projection: Vec<NamedExpression>,
1406    /// Contract field tables.
1407    #[serde(rename = "tables")]
1408    pub tables: Vec<TableBinding>,
1409}
1410impl<'de> DeserializeStrict<'de> for EvaluateRequest {
1411    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1412        #[derive(Deserialize)]
1413        #[serde(deny_unknown_fields)]
1414        struct __Wire {
1415            #[serde(rename = "projection")]
1416            projection: Strict<Vec<NamedExpression>>,
1417            #[serde(rename = "tables")]
1418            tables: Strict<Vec<TableBinding>>,
1419        }
1420        let wire = __Wire::deserialize(deserializer)?;
1421        Ok(Self {
1422            projection: wire.projection.0,
1423            tables: wire.tables.0,
1424        })
1425    }
1426}
1427
1428/// Generic opt-in execution observations, separate from row semantics. A profile aggregates the
1429/// physical plan's node measurements without retaining per-row history. Caller is an opaque
1430/// correlation ID (at most 128 ASCII letters, digits, hyphen, underscore, dot or colon).
1431/// Unsupported device and allocator observations remain unknown.
1432#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1433pub struct ExecutionOptions {
1434    /// Contract field caller.
1435    #[serde(rename = "caller")]
1436    #[serde(default, skip_serializing_if = "Option::is_none")]
1437    pub caller: Option<String>,
1438    /// Contract field partition.
1439    #[serde(rename = "partition")]
1440    #[serde(default, skip_serializing_if = "Option::is_none")]
1441    pub partition: Option<u32>,
1442    /// Contract field profile.
1443    #[serde(rename = "profile")]
1444    pub profile: bool,
1445}
1446impl<'de> DeserializeStrict<'de> for ExecutionOptions {
1447    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1448        #[derive(Deserialize)]
1449        #[serde(deny_unknown_fields)]
1450        struct __Wire {
1451            #[serde(rename = "caller")]
1452            #[serde(default)]
1453            caller: Strict<Option<String>>,
1454            #[serde(rename = "partition")]
1455            #[serde(default)]
1456            partition: Strict<Option<u32>>,
1457            #[serde(rename = "profile")]
1458            profile: Strict<bool>,
1459        }
1460        let wire = __Wire::deserialize(deserializer)?;
1461        Ok(Self {
1462            caller: wire.caller.0,
1463            partition: wire.partition.0,
1464            profile: wire.profile.0,
1465        })
1466    }
1467}
1468
1469/// An unbound SPQL expression in its protobuf encoding, base64-encoded with the standard alphabet
1470/// and padding, at most 512 KiB before encoding. The Rust SDK's `Expression` type produces it. The
1471/// service binds it against the exact input schema.
1472#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1473#[serde(transparent)]
1474pub struct Expression(pub String);
1475impl std::fmt::Display for Expression {
1476    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1477        self.0.fmt(formatter)
1478    }
1479}
1480impl<'de> DeserializeStrict<'de> for Expression {
1481    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1482        Ok(Self(Strict::<String>::deserialize(deserializer)?.0))
1483    }
1484}
1485
1486/// One top-level clause of a scan's filter and how the service enforces it.
1487#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1488pub struct FilterClause {
1489    /// Contract field expression.
1490    #[serde(rename = "expression")]
1491    pub expression: Expression,
1492    /// Contract field reason.
1493    #[serde(rename = "reason")]
1494    #[serde(default, skip_serializing_if = "Option::is_none")]
1495    pub reason: Option<String>,
1496    /// Contract field support.
1497    #[serde(rename = "support")]
1498    pub support: FilterSupport,
1499}
1500impl<'de> DeserializeStrict<'de> for FilterClause {
1501    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1502        #[derive(Deserialize)]
1503        #[serde(deny_unknown_fields)]
1504        struct __Wire {
1505            #[serde(rename = "expression")]
1506            expression: Strict<Expression>,
1507            #[serde(rename = "reason")]
1508            #[serde(default)]
1509            reason: Strict<Option<String>>,
1510            #[serde(rename = "support")]
1511            support: Strict<FilterSupport>,
1512        }
1513        let wire = __Wire::deserialize(deserializer)?;
1514        Ok(Self {
1515            expression: wire.expression.0,
1516            reason: wire.reason.0,
1517            support: wire.support.0,
1518        })
1519    }
1520}
1521
1522/// How exactly the service enforces one filter clause.
1523#[derive(Clone, Debug, PartialEq, Eq)]
1524pub enum FilterSupport {
1525    /// A known contract value.
1526    Exact,
1527    /// A known contract value.
1528    Inexact,
1529    /// A known contract value.
1530    Unsupported,
1531    /// A value introduced by a newer server.
1532    Unknown(String),
1533}
1534impl Serialize for FilterSupport {
1535    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1536        serializer.serialize_str(match self {
1537            Self::Exact => "exact",
1538            Self::Inexact => "inexact",
1539            Self::Unsupported => "unsupported",
1540            Self::Unknown(value) => value,
1541        })
1542    }
1543}
1544impl<'de> Deserialize<'de> for FilterSupport {
1545    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1546        Ok(match String::deserialize(deserializer)?.as_str() {
1547            "exact" => Self::Exact,
1548            "inexact" => Self::Inexact,
1549            "unsupported" => Self::Unsupported,
1550            value => Self::Unknown(value.to_owned()),
1551        })
1552    }
1553}
1554impl<'de> DeserializeStrict<'de> for FilterSupport {
1555    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1556        #[derive(Deserialize)]
1557        enum __Known {
1558            #[serde(rename = "exact")]
1559            Exact,
1560            #[serde(rename = "inexact")]
1561            Inexact,
1562            #[serde(rename = "unsupported")]
1563            Unsupported,
1564        }
1565        Ok(match __Known::deserialize(deserializer)? {
1566            __Known::Exact => Self::Exact,
1567            __Known::Inexact => Self::Inexact,
1568            __Known::Unsupported => Self::Unsupported,
1569        })
1570    }
1571}
1572
1573/// The receipts of the appends, patches, deleted rows, column files and mirrored files a version
1574/// takes. Patches, deletions and column files need an `edit` base, since the rows they change are
1575/// the base's rows; mirrored files, and patches to a mirroring Table, need an `aligned` base.
1576#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1577pub struct FinalizeWriteRequest {
1578    /// Contract field base.
1579    #[serde(rename = "base")]
1580    pub base: WriteBase,
1581    /// Contract field receipts.
1582    #[serde(rename = "receipts")]
1583    pub receipts: Vec<FragmentReceipt>,
1584    /// Contract field table.
1585    #[serde(rename = "table")]
1586    pub table: TableBinding,
1587}
1588impl<'de> DeserializeStrict<'de> for FinalizeWriteRequest {
1589    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1590        #[derive(Deserialize)]
1591        #[serde(deny_unknown_fields)]
1592        struct __Wire {
1593            #[serde(rename = "base")]
1594            base: Strict<WriteBase>,
1595            #[serde(rename = "receipts")]
1596            receipts: Strict<Vec<FragmentReceipt>>,
1597            #[serde(rename = "table")]
1598            table: Strict<TableBinding>,
1599        }
1600        let wire = __Wire::deserialize(deserializer)?;
1601        Ok(Self {
1602            base: wire.base.0,
1603            receipts: wire.receipts.0,
1604            table: wire.table.0,
1605        })
1606    }
1607}
1608
1609/// One file of `to`, its stored row count, and how it relates to `from`.
1610#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1611pub struct FragmentChange {
1612    /// Contract field change.
1613    #[serde(rename = "change")]
1614    pub change: FragmentDelta,
1615    /// Contract field fragmentId.
1616    #[serde(rename = "fragmentId")]
1617    pub fragment_id: Uuid,
1618    /// Contract field rowCount.
1619    #[serde(rename = "rowCount")]
1620    pub row_count: SafeUnsignedLong,
1621}
1622impl<'de> DeserializeStrict<'de> for FragmentChange {
1623    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1624        #[derive(Deserialize)]
1625        #[serde(deny_unknown_fields)]
1626        struct __Wire {
1627            #[serde(rename = "change")]
1628            change: Strict<FragmentDelta>,
1629            #[serde(rename = "fragmentId")]
1630            fragment_id: Strict<Uuid>,
1631            #[serde(rename = "rowCount")]
1632            row_count: Strict<SafeUnsignedLong>,
1633        }
1634        let wire = __Wire::deserialize(deserializer)?;
1635        Ok(Self {
1636            change: wire.change.0,
1637            fragment_id: wire.fragment_id.0,
1638            row_count: wire.row_count.0,
1639        })
1640    }
1641}
1642
1643/// `retained` for a file that `from` has at the same positions, `added` for a file written after
1644/// `from`.
1645#[derive(Clone, Debug, PartialEq, Eq)]
1646pub enum FragmentDelta {
1647    /// A known union arm.
1648    Added(AddedFragment),
1649    /// A known union arm.
1650    Retained(RetainedFragment),
1651    /// An unknown discriminator and its complete wire object.
1652    Unknown { tag: String, value: Value },
1653}
1654impl Serialize for FragmentDelta {
1655    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1656        match self {
1657            Self::Added(value) => {
1658                let mut object = serde_json::Map::new();
1659                object.insert("type".into(), Value::String("added".into()));
1660                object.insert(
1661                    "added".into(),
1662                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
1663                );
1664                Value::Object(object).serialize(serializer)
1665            }
1666            Self::Retained(value) => {
1667                let mut object = serde_json::Map::new();
1668                object.insert("type".into(), Value::String("retained".into()));
1669                object.insert(
1670                    "retained".into(),
1671                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
1672                );
1673                Value::Object(object).serialize(serializer)
1674            }
1675            Self::Unknown { tag, value } => {
1676                if value.get("type").and_then(Value::as_str) != Some(tag.as_str()) {
1677                    return Err(serde::ser::Error::custom(
1678                        "unknown union discriminator mismatch",
1679                    ));
1680                }
1681                value.serialize(serializer)
1682            }
1683        }
1684    }
1685}
1686impl<'de> Deserialize<'de> for FragmentDelta {
1687    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1688        let value = Value::deserialize(deserializer)?;
1689        let tag = value
1690            .get("type")
1691            .and_then(Value::as_str)
1692            .ok_or_else(|| serde::de::Error::custom("union requires type"))?;
1693        match tag {
1694            "added" => Ok(Self::Added(
1695                serde_json::from_value(
1696                    value
1697                        .get("added")
1698                        .cloned()
1699                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
1700                )
1701                .map_err(serde::de::Error::custom)?,
1702            )),
1703            "retained" => Ok(Self::Retained(
1704                serde_json::from_value(
1705                    value
1706                        .get("retained")
1707                        .cloned()
1708                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
1709                )
1710                .map_err(serde::de::Error::custom)?,
1711            )),
1712            tag => Ok(Self::Unknown {
1713                tag: tag.to_owned(),
1714                value,
1715            }),
1716        }
1717    }
1718}
1719impl<'de> DeserializeStrict<'de> for FragmentDelta {
1720    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1721        #[derive(Deserialize)]
1722        enum __Tag0 {
1723            #[serde(rename = "added")]
1724            Value,
1725        }
1726        #[derive(Deserialize)]
1727        #[serde(deny_unknown_fields)]
1728        struct __Arm0 {
1729            #[serde(rename = "type")]
1730            _tag: __Tag0,
1731            #[serde(rename = "added")]
1732            value: Strict<AddedFragment>,
1733        }
1734        #[derive(Deserialize)]
1735        enum __Tag1 {
1736            #[serde(rename = "retained")]
1737            Value,
1738        }
1739        #[derive(Deserialize)]
1740        #[serde(deny_unknown_fields)]
1741        struct __Arm1 {
1742            #[serde(rename = "type")]
1743            _tag: __Tag1,
1744            #[serde(rename = "retained")]
1745            value: Strict<RetainedFragment>,
1746        }
1747        #[derive(Deserialize)]
1748        #[serde(untagged)]
1749        enum __Known {
1750            Added(Box<__Arm0>),
1751            Retained(Box<__Arm1>),
1752        }
1753        Ok(match __Known::deserialize(deserializer)? {
1754            __Known::Added(arm) => Self::Added(arm.value.0),
1755            __Known::Retained(arm) => Self::Retained(arm.value.0),
1756        })
1757    }
1758}
1759
1760/// One file an append wrote. Pass it unchanged to finalize a write.
1761#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1762pub struct FragmentReceipt {
1763    /// Contract field token.
1764    #[serde(rename = "token")]
1765    pub token: String,
1766}
1767impl<'de> DeserializeStrict<'de> for FragmentReceipt {
1768    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1769        #[derive(Deserialize)]
1770        #[serde(deny_unknown_fields)]
1771        struct __Wire {
1772            #[serde(rename = "token")]
1773            token: Strict<String>,
1774        }
1775        let wire = __Wire::deserialize(deserializer)?;
1776        Ok(Self {
1777            token: wire.token.0,
1778        })
1779    }
1780}
1781
1782/// A standard SQL spelling of a canonical SPQL function and its provenance.
1783#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1784pub struct FunctionAlias {
1785    /// Contract field name.
1786    #[serde(rename = "name")]
1787    pub name: String,
1788    /// Contract field source.
1789    #[serde(rename = "source")]
1790    pub source: String,
1791}
1792impl<'de> DeserializeStrict<'de> for FunctionAlias {
1793    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1794        #[derive(Deserialize)]
1795        #[serde(deny_unknown_fields)]
1796        struct __Wire {
1797            #[serde(rename = "name")]
1798            name: Strict<String>,
1799            #[serde(rename = "source")]
1800            source: Strict<String>,
1801        }
1802        let wire = __Wire::deserialize(deserializer)?;
1803        Ok(Self {
1804            name: wire.name.0,
1805            source: wire.source.0,
1806        })
1807    }
1808}
1809
1810/// FunctionCatalog contract value.
1811#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1812pub struct FunctionCatalog {
1813    /// Contract field functions.
1814    #[serde(rename = "functions")]
1815    pub functions: Vec<FunctionInfo>,
1816}
1817impl<'de> DeserializeStrict<'de> for FunctionCatalog {
1818    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1819        #[derive(Deserialize)]
1820        #[serde(deny_unknown_fields)]
1821        struct __Wire {
1822            #[serde(rename = "functions")]
1823            functions: Strict<Vec<FunctionInfo>>,
1824        }
1825        let wire = __Wire::deserialize(deserializer)?;
1826        Ok(Self {
1827            functions: wire.functions.0,
1828        })
1829    }
1830}
1831
1832/// An SPQL function, with its overloads in the order a call resolves them.
1833#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1834pub struct FunctionInfo {
1835    /// Contract field aliases.
1836    #[serde(rename = "aliases")]
1837    #[serde(default, skip_serializing_if = "Option::is_none")]
1838    pub aliases: Option<Vec<FunctionAlias>>,
1839    /// Contract field id.
1840    #[serde(rename = "id")]
1841    pub id: String,
1842    /// Contract field overloads.
1843    #[serde(rename = "overloads")]
1844    pub overloads: Vec<OverloadInfo>,
1845    /// Contract field volatility.
1846    #[serde(rename = "volatility")]
1847    pub volatility: FunctionVolatility,
1848}
1849impl<'de> DeserializeStrict<'de> for FunctionInfo {
1850    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1851        #[derive(Deserialize)]
1852        #[serde(deny_unknown_fields)]
1853        struct __Wire {
1854            #[serde(rename = "aliases")]
1855            #[serde(default)]
1856            aliases: Strict<Option<Vec<FunctionAlias>>>,
1857            #[serde(rename = "id")]
1858            id: Strict<String>,
1859            #[serde(rename = "overloads")]
1860            overloads: Strict<Vec<OverloadInfo>>,
1861            #[serde(rename = "volatility")]
1862            volatility: Strict<FunctionVolatility>,
1863        }
1864        let wire = __Wire::deserialize(deserializer)?;
1865        Ok(Self {
1866            aliases: wire.aliases.0,
1867            id: wire.id.0,
1868            overloads: wire.overloads.0,
1869            volatility: wire.volatility.0,
1870        })
1871    }
1872}
1873
1874/// Whether a function's result can change for the same arguments.
1875#[derive(Clone, Debug, PartialEq, Eq)]
1876pub enum FunctionVolatility {
1877    /// A known contract value.
1878    Immutable,
1879    /// A known contract value.
1880    Stable,
1881    /// A known contract value.
1882    Volatile,
1883    /// A value introduced by a newer server.
1884    Unknown(String),
1885}
1886impl Serialize for FunctionVolatility {
1887    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1888        serializer.serialize_str(match self {
1889            Self::Immutable => "immutable",
1890            Self::Stable => "stable",
1891            Self::Volatile => "volatile",
1892            Self::Unknown(value) => value,
1893        })
1894    }
1895}
1896impl<'de> Deserialize<'de> for FunctionVolatility {
1897    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1898        Ok(match String::deserialize(deserializer)?.as_str() {
1899            "immutable" => Self::Immutable,
1900            "stable" => Self::Stable,
1901            "volatile" => Self::Volatile,
1902            value => Self::Unknown(value.to_owned()),
1903        })
1904    }
1905}
1906impl<'de> DeserializeStrict<'de> for FunctionVolatility {
1907    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1908        #[derive(Deserialize)]
1909        enum __Known {
1910            #[serde(rename = "immutable")]
1911            Immutable,
1912            #[serde(rename = "stable")]
1913            Stable,
1914            #[serde(rename = "volatile")]
1915            Volatile,
1916        }
1917        Ok(match __Known::deserialize(deserializer)? {
1918            __Known::Immutable => Self::Immutable,
1919            __Known::Stable => Self::Stable,
1920            __Known::Volatile => Self::Volatile,
1921        })
1922    }
1923}
1924
1925/// The Table's first version, with the schema its appends used.
1926#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1927pub struct GenesisBase {
1928    /// Contract field schema.
1929    #[serde(rename = "schema")]
1930    pub schema: ArrowSchema,
1931}
1932impl<'de> DeserializeStrict<'de> for GenesisBase {
1933    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1934        #[derive(Deserialize)]
1935        #[serde(deny_unknown_fields)]
1936        struct __Wire {
1937            #[serde(rename = "schema")]
1938            schema: Strict<ArrowSchema>,
1939        }
1940        let wire = __Wire::deserialize(deserializer)?;
1941        Ok(Self {
1942            schema: wire.schema.0,
1943        })
1944    }
1945}
1946
1947/// Counts of a numeric column's values in `bins` bins of `width` from `start`, as a fixed-size list
1948/// of `bins + 2` counts: values below `start`, each bin in order, then values at or past the last
1949/// bin's end. Nulls and NaN are not counted. `bins` is at most 4,096.
1950#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
1951pub struct HistogramAggregate {
1952    /// Contract field bins.
1953    #[serde(rename = "bins")]
1954    pub bins: u32,
1955    /// Contract field column.
1956    #[serde(rename = "column")]
1957    pub column: String,
1958    /// Contract field start.
1959    #[serde(rename = "start")]
1960    pub start: f64,
1961    /// Contract field width.
1962    #[serde(rename = "width")]
1963    pub width: f64,
1964}
1965impl<'de> DeserializeStrict<'de> for HistogramAggregate {
1966    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
1967        #[derive(Deserialize)]
1968        #[serde(deny_unknown_fields)]
1969        struct __Wire {
1970            #[serde(rename = "bins")]
1971            bins: Strict<u32>,
1972            #[serde(rename = "column")]
1973            column: Strict<String>,
1974            #[serde(rename = "start")]
1975            start: Strict<f64>,
1976            #[serde(rename = "width")]
1977            width: Strict<f64>,
1978        }
1979        let wire = __Wire::deserialize(deserializer)?;
1980        Ok(Self {
1981            bins: wire.bins.0,
1982            column: wire.column.0,
1983            start: wire.start.0,
1984            width: wire.width.0,
1985        })
1986    }
1987}
1988
1989/// One typed predicate, applied before the read window. Kinds are text, number, boolean, uuid,
1990/// date, timestamp, duration and other. Operators are isNull, isNotNull, isTrue, isFalse, isEmpty,
1991/// isNotEmpty, contains, startsWith, endsWith, eq, notEq, gt, gte, lt and lte. Values are bound as
1992/// typed parameters; callers cannot submit SQL. Column and operator compatibility is checked by the
1993/// scan engine, including ordered text comparisons.
1994#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1995pub struct LegacyFilter {
1996    /// Contract field field.
1997    #[serde(rename = "field")]
1998    pub field: String,
1999    /// Contract field kind.
2000    #[serde(rename = "kind")]
2001    pub kind: String,
2002    /// Contract field operator.
2003    #[serde(rename = "operator")]
2004    pub operator: String,
2005    /// Contract field value.
2006    #[serde(rename = "value")]
2007    #[serde(default, skip_serializing_if = "Option::is_none")]
2008    pub value: Option<String>,
2009}
2010impl<'de> DeserializeStrict<'de> for LegacyFilter {
2011    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2012        #[derive(Deserialize)]
2013        #[serde(deny_unknown_fields)]
2014        struct __Wire {
2015            #[serde(rename = "field")]
2016            field: Strict<String>,
2017            #[serde(rename = "kind")]
2018            kind: Strict<String>,
2019            #[serde(rename = "operator")]
2020            operator: Strict<String>,
2021            #[serde(rename = "value")]
2022            #[serde(default)]
2023            value: Strict<Option<String>>,
2024        }
2025        let wire = __Wire::deserialize(deserializer)?;
2026        Ok(Self {
2027            field: wire.field.0,
2028            kind: wire.kind.0,
2029            operator: wire.operator.0,
2030            value: wire.value.0,
2031        })
2032    }
2033}
2034
2035/// Resolved legacy table metadata from GET /v1/tables/{tableId}/read-snapshot, passed unchanged:
2036/// tableId, asof, keySchema, keySpace and columnGroups. WAL patches are already folded at asof. No
2037/// credentials or endpoints occur here. This is a live read snapshot, not an Arbor version or a
2038/// resumable split.
2039#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2040#[serde(transparent)]
2041pub struct LegacyTableSnapshot(pub Value);
2042impl<'de> DeserializeStrict<'de> for LegacyTableSnapshot {
2043    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2044        Ok(Self(Strict::<Value>::deserialize(deserializer)?.0))
2045    }
2046}
2047
2048/// Move the column or field at `path` after `after`, or first when absent.
2049#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2050pub struct MoveColumn {
2051    /// Contract field after.
2052    #[serde(rename = "after")]
2053    #[serde(default, skip_serializing_if = "Option::is_none")]
2054    pub after: Option<Vec<String>>,
2055    /// Contract field path.
2056    #[serde(rename = "path")]
2057    pub path: Vec<String>,
2058}
2059impl<'de> DeserializeStrict<'de> for MoveColumn {
2060    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2061        #[derive(Deserialize)]
2062        #[serde(deny_unknown_fields)]
2063        struct __Wire {
2064            #[serde(rename = "after")]
2065            #[serde(default)]
2066            after: Strict<Option<Vec<String>>>,
2067            #[serde(rename = "path")]
2068            path: Strict<Vec<String>>,
2069        }
2070        let wire = __Wire::deserialize(deserializer)?;
2071        Ok(Self {
2072            after: wire.after.0,
2073            path: wire.path.0,
2074        })
2075    }
2076}
2077
2078/// One aggregate of an aggregate emit, as the output column `name`.
2079#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
2080pub struct NamedAggregate {
2081    /// Contract field function.
2082    #[serde(rename = "function")]
2083    pub function: AggregateFunction,
2084    /// Contract field name.
2085    #[serde(rename = "name")]
2086    pub name: String,
2087}
2088impl<'de> DeserializeStrict<'de> for NamedAggregate {
2089    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2090        #[derive(Deserialize)]
2091        #[serde(deny_unknown_fields)]
2092        struct __Wire {
2093            #[serde(rename = "function")]
2094            function: Strict<AggregateFunction>,
2095            #[serde(rename = "name")]
2096            name: Strict<String>,
2097        }
2098        let wire = __Wire::deserialize(deserializer)?;
2099        Ok(Self {
2100            function: wire.function.0,
2101            name: wire.name.0,
2102        })
2103    }
2104}
2105
2106/// One output column computed from each input row.
2107#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2108pub struct NamedExpression {
2109    /// Contract field expression.
2110    #[serde(rename = "expression")]
2111    pub expression: Expression,
2112    /// Contract field name.
2113    #[serde(rename = "name")]
2114    pub name: String,
2115}
2116impl<'de> DeserializeStrict<'de> for NamedExpression {
2117    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2118        #[derive(Deserialize)]
2119        #[serde(deny_unknown_fields)]
2120        struct __Wire {
2121            #[serde(rename = "expression")]
2122            expression: Strict<Expression>,
2123            #[serde(rename = "name")]
2124            name: Strict<String>,
2125        }
2126        let wire = __Wire::deserialize(deserializer)?;
2127        Ok(Self {
2128            expression: wire.expression.0,
2129            name: wire.name.0,
2130        })
2131    }
2132}
2133
2134/// One overload of a function. `asynchronous` overloads run between batches, as storage reads do.
2135#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2136pub struct OverloadInfo {
2137    /// Contract field asynchronous.
2138    #[serde(rename = "asynchronous")]
2139    #[serde(default, skip_serializing_if = "Option::is_none")]
2140    pub asynchronous: Option<bool>,
2141    /// Contract field name.
2142    #[serde(rename = "name")]
2143    pub name: String,
2144    /// Contract field parameters.
2145    #[serde(rename = "parameters")]
2146    pub parameters: Vec<ParameterInfo>,
2147    /// Contract field summary.
2148    #[serde(rename = "summary")]
2149    pub summary: String,
2150}
2151impl<'de> DeserializeStrict<'de> for OverloadInfo {
2152    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2153        #[derive(Deserialize)]
2154        #[serde(deny_unknown_fields)]
2155        struct __Wire {
2156            #[serde(rename = "asynchronous")]
2157            #[serde(default)]
2158            asynchronous: Strict<Option<bool>>,
2159            #[serde(rename = "name")]
2160            name: Strict<String>,
2161            #[serde(rename = "parameters")]
2162            parameters: Strict<Vec<ParameterInfo>>,
2163            #[serde(rename = "summary")]
2164            summary: Strict<String>,
2165        }
2166        let wire = __Wire::deserialize(deserializer)?;
2167        Ok(Self {
2168            asynchronous: wire.asynchronous.0,
2169            name: wire.name.0,
2170            parameters: wire.parameters.0,
2171            summary: wire.summary.0,
2172        })
2173    }
2174}
2175
2176/// PackBlobsRequest contract value.
2177#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2178pub struct PackBlobsRequest {
2179    /// Contract field attempt.
2180    #[serde(rename = "attempt")]
2181    #[serde(default, skip_serializing_if = "Option::is_none")]
2182    pub attempt: Option<Uuid>,
2183    /// Contract field table.
2184    #[serde(rename = "table")]
2185    pub table: TableBinding,
2186}
2187impl<'de> DeserializeStrict<'de> for PackBlobsRequest {
2188    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2189        #[derive(Deserialize)]
2190        #[serde(deny_unknown_fields)]
2191        struct __Wire {
2192            #[serde(rename = "attempt")]
2193            #[serde(default)]
2194            attempt: Strict<Option<Uuid>>,
2195            #[serde(rename = "table")]
2196            table: Strict<TableBinding>,
2197        }
2198        let wire = __Wire::deserialize(deserializer)?;
2199        Ok(Self {
2200            attempt: wire.attempt.0,
2201            table: wire.table.0,
2202        })
2203    }
2204}
2205
2206/// One parameter of an overload. `accepts` names the accepted types, such as `utf8`.
2207#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2208pub struct ParameterInfo {
2209    /// Contract field accepts.
2210    #[serde(rename = "accepts")]
2211    pub accepts: String,
2212    /// Contract field literal.
2213    #[serde(rename = "literal")]
2214    pub literal: bool,
2215    /// Contract field name.
2216    #[serde(rename = "name")]
2217    pub name: String,
2218    /// Contract field required.
2219    #[serde(rename = "required")]
2220    pub required: bool,
2221}
2222impl<'de> DeserializeStrict<'de> for ParameterInfo {
2223    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2224        #[derive(Deserialize)]
2225        #[serde(deny_unknown_fields)]
2226        struct __Wire {
2227            #[serde(rename = "accepts")]
2228            accepts: Strict<String>,
2229            #[serde(rename = "literal")]
2230            literal: Strict<bool>,
2231            #[serde(rename = "name")]
2232            name: Strict<String>,
2233            #[serde(rename = "required")]
2234            required: Strict<bool>,
2235        }
2236        let wire = __Wire::deserialize(deserializer)?;
2237        Ok(Self {
2238            accepts: wire.accepts.0,
2239            literal: wire.literal.0,
2240            name: wire.name.0,
2241            required: wire.required.0,
2242        })
2243    }
2244}
2245
2246/// A storage partition key and its canonical Iceberg transform.
2247#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2248pub struct PartitionColumn {
2249    /// Contract field path.
2250    #[serde(rename = "path")]
2251    pub path: Vec<String>,
2252    /// Contract field transform.
2253    #[serde(rename = "transform")]
2254    pub transform: String,
2255}
2256impl<'de> DeserializeStrict<'de> for PartitionColumn {
2257    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2258        #[derive(Deserialize)]
2259        #[serde(deny_unknown_fields)]
2260        struct __Wire {
2261            #[serde(rename = "path")]
2262            path: Strict<Vec<String>>,
2263            #[serde(rename = "transform")]
2264            transform: Strict<String>,
2265        }
2266        let wire = __Wire::deserialize(deserializer)?;
2267        Ok(Self {
2268            path: wire.path.0,
2269            transform: wire.transform.0,
2270        })
2271    }
2272}
2273
2274/// The Table whose rows to patch, the version they belong to, and the write attempt whose directory
2275/// the patch files go under. The Arrow rows name each target by its row ID in `rowIdColumn`, a
2276/// `uint64` column; their other columns are columns of the Table, after `schemaChanges`, and
2277/// replace those values. A row ID appears at most once per request.
2278#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2279pub struct PatchRowsRequest {
2280    /// Contract field attempt.
2281    #[serde(rename = "attempt")]
2282    #[serde(default, skip_serializing_if = "Option::is_none")]
2283    pub attempt: Option<Uuid>,
2284    /// Contract field base.
2285    #[serde(rename = "base")]
2286    pub base: Uuid,
2287    /// Contract field rowIdColumn.
2288    #[serde(rename = "rowIdColumn")]
2289    pub row_id_column: String,
2290    /// Contract field schemaChanges.
2291    #[serde(rename = "schemaChanges")]
2292    #[serde(default, skip_serializing_if = "Option::is_none")]
2293    pub schema_changes: Option<Vec<SchemaChange>>,
2294    /// Contract field table.
2295    #[serde(rename = "table")]
2296    pub table: TableBinding,
2297}
2298impl<'de> DeserializeStrict<'de> for PatchRowsRequest {
2299    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2300        #[derive(Deserialize)]
2301        #[serde(deny_unknown_fields)]
2302        struct __Wire {
2303            #[serde(rename = "attempt")]
2304            #[serde(default)]
2305            attempt: Strict<Option<Uuid>>,
2306            #[serde(rename = "base")]
2307            base: Strict<Uuid>,
2308            #[serde(rename = "rowIdColumn")]
2309            row_id_column: Strict<String>,
2310            #[serde(rename = "schemaChanges")]
2311            #[serde(default)]
2312            schema_changes: Strict<Option<Vec<SchemaChange>>>,
2313            #[serde(rename = "table")]
2314            table: Strict<TableBinding>,
2315        }
2316        let wire = __Wire::deserialize(deserializer)?;
2317        Ok(Self {
2318            attempt: wire.attempt.0,
2319            base: wire.base.0,
2320            row_id_column: wire.row_id_column.0,
2321            schema_changes: wire.schema_changes.0,
2322            table: wire.table.0,
2323        })
2324    }
2325}
2326
2327/// Two versions of one Table: `to`, and `from`, which is `to` or one of its ancestors at most 4,096
2328/// versions back. `columns` names the top-level columns of `to` whose changes count, or all of them
2329/// when absent.
2330#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2331pub struct PlanChangesRequest {
2332    /// Contract field columns.
2333    #[serde(rename = "columns")]
2334    #[serde(default, skip_serializing_if = "Option::is_none")]
2335    pub columns: Option<Vec<String>>,
2336    /// Contract field from.
2337    #[serde(rename = "from")]
2338    pub from: Uuid,
2339    /// Contract field storage.
2340    #[serde(rename = "storage")]
2341    #[serde(default, skip_serializing_if = "Option::is_none")]
2342    pub storage: Option<StorageBinding>,
2343    /// Contract field table.
2344    #[serde(rename = "table")]
2345    pub table: Uuid,
2346    /// Contract field to.
2347    #[serde(rename = "to")]
2348    pub to: Uuid,
2349}
2350impl<'de> DeserializeStrict<'de> for PlanChangesRequest {
2351    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2352        #[derive(Deserialize)]
2353        #[serde(deny_unknown_fields)]
2354        struct __Wire {
2355            #[serde(rename = "columns")]
2356            #[serde(default)]
2357            columns: Strict<Option<Vec<String>>>,
2358            #[serde(rename = "from")]
2359            from: Strict<Uuid>,
2360            #[serde(rename = "storage")]
2361            #[serde(default)]
2362            storage: Strict<Option<StorageBinding>>,
2363            #[serde(rename = "table")]
2364            table: Strict<Uuid>,
2365            #[serde(rename = "to")]
2366            to: Strict<Uuid>,
2367        }
2368        let wire = __Wire::deserialize(deserializer)?;
2369        Ok(Self {
2370            columns: wire.columns.0,
2371            from: wire.from.0,
2372            storage: wire.storage.0,
2373            table: wire.table.0,
2374            to: wire.to.0,
2375        })
2376    }
2377}
2378
2379/// PlanScanRequest contract value.
2380#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
2381pub struct PlanScanRequest {
2382    /// Contract field scan.
2383    #[serde(rename = "scan")]
2384    pub scan: Scan,
2385    /// Contract field storage.
2386    #[serde(rename = "storage")]
2387    #[serde(default, skip_serializing_if = "Option::is_none")]
2388    pub storage: Option<StorageBinding>,
2389}
2390impl<'de> DeserializeStrict<'de> for PlanScanRequest {
2391    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2392        #[derive(Deserialize)]
2393        #[serde(deny_unknown_fields)]
2394        struct __Wire {
2395            #[serde(rename = "scan")]
2396            scan: Strict<Scan>,
2397            #[serde(rename = "storage")]
2398            #[serde(default)]
2399            storage: Strict<Option<StorageBinding>>,
2400        }
2401        let wire = __Wire::deserialize(deserializer)?;
2402        Ok(Self {
2403            scan: wire.scan.0,
2404            storage: wire.storage.0,
2405        })
2406    }
2407}
2408
2409/// A split chosen by planning, with estimates for scheduling, and the stable ID of the file it
2410/// reads, which change plans and column attachments name.
2411#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2412pub struct PlannedSplit {
2413    /// Contract field estimatedBytes.
2414    #[serde(rename = "estimatedBytes")]
2415    #[serde(default, skip_serializing_if = "Option::is_none")]
2416    pub estimated_bytes: Option<SafeUnsignedLong>,
2417    /// Contract field estimatedRows.
2418    #[serde(rename = "estimatedRows")]
2419    #[serde(default, skip_serializing_if = "Option::is_none")]
2420    pub estimated_rows: Option<SafeUnsignedLong>,
2421    /// Contract field fragmentId.
2422    #[serde(rename = "fragmentId")]
2423    #[serde(default, skip_serializing_if = "Option::is_none")]
2424    pub fragment_id: Option<Uuid>,
2425    /// Contract field ordering.
2426    #[serde(rename = "ordering")]
2427    #[serde(default, skip_serializing_if = "Option::is_none")]
2428    pub ordering: Option<Vec<SortColumn>>,
2429    /// Contract field split.
2430    #[serde(rename = "split")]
2431    pub split: Split,
2432}
2433impl<'de> DeserializeStrict<'de> for PlannedSplit {
2434    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2435        #[derive(Deserialize)]
2436        #[serde(deny_unknown_fields)]
2437        struct __Wire {
2438            #[serde(rename = "estimatedBytes")]
2439            #[serde(default)]
2440            estimated_bytes: Strict<Option<SafeUnsignedLong>>,
2441            #[serde(rename = "estimatedRows")]
2442            #[serde(default)]
2443            estimated_rows: Strict<Option<SafeUnsignedLong>>,
2444            #[serde(rename = "fragmentId")]
2445            #[serde(default)]
2446            fragment_id: Strict<Option<Uuid>>,
2447            #[serde(rename = "ordering")]
2448            #[serde(default)]
2449            ordering: Strict<Option<Vec<SortColumn>>>,
2450            #[serde(rename = "split")]
2451            split: Strict<Split>,
2452        }
2453        let wire = __Wire::deserialize(deserializer)?;
2454        Ok(Self {
2455            estimated_bytes: wire.estimated_bytes.0,
2456            estimated_rows: wire.estimated_rows.0,
2457            fragment_id: wire.fragment_id.0,
2458            ordering: wire.ordering.0,
2459            split: wire.split.0,
2460        })
2461    }
2462}
2463
2464/// A prepared Table version, awaiting registration with the Tables API. `sequence` is its position
2465/// in the Table's history.
2466#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2467pub struct PreparedWriteReceipt {
2468    /// Contract field baseVersion.
2469    #[serde(rename = "baseVersion")]
2470    #[serde(default, skip_serializing_if = "Option::is_none")]
2471    pub base_version: Option<Uuid>,
2472    /// Contract field resourceId.
2473    #[serde(rename = "resourceId")]
2474    pub resource_id: Uuid,
2475    /// Contract field sequence.
2476    #[serde(rename = "sequence")]
2477    pub sequence: SafeUnsignedLong,
2478    /// Contract field versionId.
2479    #[serde(rename = "versionId")]
2480    pub version_id: Uuid,
2481}
2482impl<'de> DeserializeStrict<'de> for PreparedWriteReceipt {
2483    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2484        #[derive(Deserialize)]
2485        #[serde(deny_unknown_fields)]
2486        struct __Wire {
2487            #[serde(rename = "baseVersion")]
2488            #[serde(default)]
2489            base_version: Strict<Option<Uuid>>,
2490            #[serde(rename = "resourceId")]
2491            resource_id: Strict<Uuid>,
2492            #[serde(rename = "sequence")]
2493            sequence: Strict<SafeUnsignedLong>,
2494            #[serde(rename = "versionId")]
2495            version_id: Strict<Uuid>,
2496        }
2497        let wire = __Wire::deserialize(deserializer)?;
2498        Ok(Self {
2499            base_version: wire.base_version.0,
2500            resource_id: wire.resource_id.0,
2501            sequence: wire.sequence.0,
2502            version_id: wire.version_id.0,
2503        })
2504    }
2505}
2506
2507/// ReadBlobRequest contract value.
2508#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2509pub struct ReadBlobRequest {
2510    /// Contract field blob.
2511    #[serde(rename = "blob")]
2512    pub blob: Blob,
2513    /// Contract field range.
2514    #[serde(rename = "range")]
2515    #[serde(default, skip_serializing_if = "Option::is_none")]
2516    pub range: Option<ByteRange>,
2517    /// Contract field storage.
2518    #[serde(rename = "storage")]
2519    #[serde(default, skip_serializing_if = "Option::is_none")]
2520    pub storage: Option<StorageBinding>,
2521}
2522impl<'de> DeserializeStrict<'de> for ReadBlobRequest {
2523    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2524        #[derive(Deserialize)]
2525        #[serde(deny_unknown_fields)]
2526        struct __Wire {
2527            #[serde(rename = "blob")]
2528            blob: Strict<Blob>,
2529            #[serde(rename = "range")]
2530            #[serde(default)]
2531            range: Strict<Option<ByteRange>>,
2532            #[serde(rename = "storage")]
2533            #[serde(default)]
2534            storage: Strict<Option<StorageBinding>>,
2535        }
2536        let wire = __Wire::deserialize(deserializer)?;
2537        Ok(Self {
2538            blob: wire.blob.0,
2539            range: wire.range.0,
2540            storage: wire.storage.0,
2541        })
2542    }
2543}
2544
2545/// A bounded legacy read over host-resolved metadata and storage. limit is at most 10000; zero
2546/// reads only the schema, otherwise one extra row signals truncation. offset is at most 10000. Up
2547/// to 32 filters are allowed. scope is Cell, Panel or FullView for images. The read has a
2548/// one-minute deadline and a 64 MiB output bound. Optional filter is an exact synchronous
2549/// expression conjoined with filters before the window. Supported forms are field references, typed
2550/// literals, comparisons, boolean operators, null checks and synchronous SPQL calls. Other
2551/// expression forms are rejected. Optional columns selects top-level fields in output order after
2552/// filtering; absent selects all fields.
2553#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2554pub struct ReadLegacyTableRequest {
2555    /// Contract field columns.
2556    #[serde(rename = "columns")]
2557    #[serde(default, skip_serializing_if = "Option::is_none")]
2558    pub columns: Option<Vec<String>>,
2559    /// Contract field filter.
2560    #[serde(rename = "filter")]
2561    #[serde(default, skip_serializing_if = "Option::is_none")]
2562    pub filter: Option<Expression>,
2563    /// Contract field filters.
2564    #[serde(rename = "filters")]
2565    pub filters: Vec<LegacyFilter>,
2566    /// Contract field limit.
2567    #[serde(rename = "limit")]
2568    pub limit: u32,
2569    /// Contract field offset.
2570    #[serde(rename = "offset")]
2571    pub offset: u32,
2572    /// Contract field scope.
2573    #[serde(rename = "scope")]
2574    pub scope: String,
2575    /// Contract field snapshot.
2576    #[serde(rename = "snapshot")]
2577    pub snapshot: LegacyTableSnapshot,
2578    /// Contract field storage.
2579    #[serde(rename = "storage")]
2580    #[serde(default, skip_serializing_if = "Option::is_none")]
2581    pub storage: Option<StorageBinding>,
2582}
2583impl<'de> DeserializeStrict<'de> for ReadLegacyTableRequest {
2584    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2585        #[derive(Deserialize)]
2586        #[serde(deny_unknown_fields)]
2587        struct __Wire {
2588            #[serde(rename = "columns")]
2589            #[serde(default)]
2590            columns: Strict<Option<Vec<String>>>,
2591            #[serde(rename = "filter")]
2592            #[serde(default)]
2593            filter: Strict<Option<Expression>>,
2594            #[serde(rename = "filters")]
2595            filters: Strict<Vec<LegacyFilter>>,
2596            #[serde(rename = "limit")]
2597            limit: Strict<u32>,
2598            #[serde(rename = "offset")]
2599            offset: Strict<u32>,
2600            #[serde(rename = "scope")]
2601            scope: Strict<String>,
2602            #[serde(rename = "snapshot")]
2603            snapshot: Strict<LegacyTableSnapshot>,
2604            #[serde(rename = "storage")]
2605            #[serde(default)]
2606            storage: Strict<Option<StorageBinding>>,
2607        }
2608        let wire = __Wire::deserialize(deserializer)?;
2609        Ok(Self {
2610            columns: wire.columns.0,
2611            filter: wire.filter.0,
2612            filters: wire.filters.0,
2613            limit: wire.limit.0,
2614            offset: wire.offset.0,
2615            scope: wire.scope.0,
2616            snapshot: wire.snapshot.0,
2617            storage: wire.storage.0,
2618        })
2619    }
2620}
2621
2622/// ReadScanRequest contract value.
2623#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
2624pub struct ReadScanRequest {
2625    /// Contract field scan.
2626    #[serde(rename = "scan")]
2627    pub scan: Scan,
2628    /// Contract field split.
2629    #[serde(rename = "split")]
2630    pub split: Split,
2631    /// Contract field storage.
2632    #[serde(rename = "storage")]
2633    #[serde(default, skip_serializing_if = "Option::is_none")]
2634    pub storage: Option<StorageBinding>,
2635}
2636impl<'de> DeserializeStrict<'de> for ReadScanRequest {
2637    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2638        #[derive(Deserialize)]
2639        #[serde(deny_unknown_fields)]
2640        struct __Wire {
2641            #[serde(rename = "scan")]
2642            scan: Strict<Scan>,
2643            #[serde(rename = "split")]
2644            split: Strict<Split>,
2645            #[serde(rename = "storage")]
2646            #[serde(default)]
2647            storage: Strict<Option<StorageBinding>>,
2648        }
2649        let wire = __Wire::deserialize(deserializer)?;
2650        Ok(Self {
2651            scan: wire.scan.0,
2652            split: wire.split.0,
2653            storage: wire.storage.0,
2654        })
2655    }
2656}
2657
2658/// Rename the column or field at `path` to `name`, keeping its values.
2659#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2660pub struct RenameColumn {
2661    /// Contract field name.
2662    #[serde(rename = "name")]
2663    pub name: String,
2664    /// Contract field path.
2665    #[serde(rename = "path")]
2666    pub path: Vec<String>,
2667}
2668impl<'de> DeserializeStrict<'de> for RenameColumn {
2669    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2670        #[derive(Deserialize)]
2671        #[serde(deny_unknown_fields)]
2672        struct __Wire {
2673            #[serde(rename = "name")]
2674            name: Strict<String>,
2675            #[serde(rename = "path")]
2676            path: Strict<Vec<String>>,
2677        }
2678        let wire = __Wire::deserialize(deserializer)?;
2679        Ok(Self {
2680            name: wire.name.0,
2681            path: wire.path.0,
2682        })
2683    }
2684}
2685
2686/// A file of `from`, row for row at the same positions. `patched` holds the rows that `to` keeps
2687/// and whose requested columns a patch or column file wrote after `from`; `deleted` holds the rows
2688/// deleted after `from`. Every other row holds the values it held in `from`, so the file is
2689/// unchanged when both are empty.
2690#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2691pub struct RetainedFragment {
2692    /// Contract field deleted.
2693    #[serde(rename = "deleted")]
2694    pub deleted: Vec<RowIdRange>,
2695    /// Contract field patched.
2696    #[serde(rename = "patched")]
2697    pub patched: Vec<RowIdRange>,
2698}
2699impl<'de> DeserializeStrict<'de> for RetainedFragment {
2700    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2701        #[derive(Deserialize)]
2702        #[serde(deny_unknown_fields)]
2703        struct __Wire {
2704            #[serde(rename = "deleted")]
2705            deleted: Strict<Vec<RowIdRange>>,
2706            #[serde(rename = "patched")]
2707            patched: Strict<Vec<RowIdRange>>,
2708        }
2709        let wire = __Wire::deserialize(deserializer)?;
2710        Ok(Self {
2711            deleted: wire.deleted.0,
2712            patched: wire.patched.0,
2713        })
2714    }
2715}
2716
2717/// Row IDs `start..end`.
2718#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2719pub struct RowIdRange {
2720    /// Contract field end.
2721    #[serde(rename = "end")]
2722    pub end: SafeUnsignedLong,
2723    /// Contract field start.
2724    #[serde(rename = "start")]
2725    pub start: SafeUnsignedLong,
2726}
2727impl<'de> DeserializeStrict<'de> for RowIdRange {
2728    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2729        #[derive(Deserialize)]
2730        #[serde(deny_unknown_fields)]
2731        struct __Wire {
2732            #[serde(rename = "end")]
2733            end: Strict<SafeUnsignedLong>,
2734            #[serde(rename = "start")]
2735            start: Strict<SafeUnsignedLong>,
2736        }
2737        let wire = __Wire::deserialize(deserializer)?;
2738        Ok(Self {
2739            end: wire.end.0,
2740            start: wire.start.0,
2741        })
2742    }
2743}
2744
2745/// Stored rows `start..end` of one file, counted from its first stored row.
2746#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2747pub struct RowRange {
2748    /// Contract field end.
2749    #[serde(rename = "end")]
2750    pub end: SafeUnsignedLong,
2751    /// Contract field start.
2752    #[serde(rename = "start")]
2753    pub start: SafeUnsignedLong,
2754}
2755impl<'de> DeserializeStrict<'de> for RowRange {
2756    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2757        #[derive(Deserialize)]
2758        #[serde(deny_unknown_fields)]
2759        struct __Wire {
2760            #[serde(rename = "end")]
2761            end: Strict<SafeUnsignedLong>,
2762            #[serde(rename = "start")]
2763            start: Strict<SafeUnsignedLong>,
2764        }
2765        let wire = __Wire::deserialize(deserializer)?;
2766        Ok(Self {
2767            end: wire.end.0,
2768            start: wire.start.0,
2769        })
2770    }
2771}
2772
2773/// A read of one Table version, sent whole with every plan and read request. `columns` selects
2774/// top-level columns, or all of them when absent; `projection` computes the output columns instead.
2775/// A `filter` clause that the service cannot enforce exactly fails the scan before any rows are
2776/// read. `limit` caps the rows each split returns, in stored order. An `emit` returns a top-k or
2777/// aggregates of the output rows instead of the rows themselves. `rowRange` selects half-open
2778/// stored positions in this exact version, before filtering and deletion removal, concatenating
2779/// fragments in stored order. Positions are not stable across rewrites. Empty ranges return no
2780/// rows; reversed ranges are invalid. `rowIdColumn` adds a last output column of that name holding
2781/// each row's row ID: the Table's stable identity of the row, a `uint64` that survives rewrites and
2782/// compaction and is never reused. `rowIds` keeps only rows whose row IDs fall in its ranges:
2783/// planning prunes files whose row IDs cannot match, and reads enforce it exactly. A top-k can
2784/// return and order by the row ID column. Aggregates take no `rowIdColumn`.
2785#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
2786pub struct Scan {
2787    /// Contract field batchRows.
2788    #[serde(rename = "batchRows")]
2789    #[serde(default, skip_serializing_if = "Option::is_none")]
2790    pub batch_rows: Option<u32>,
2791    /// Contract field collectMetrics.
2792    #[serde(rename = "collectMetrics")]
2793    #[serde(default, skip_serializing_if = "Option::is_none")]
2794    pub collect_metrics: Option<bool>,
2795    /// Contract field columns.
2796    #[serde(rename = "columns")]
2797    #[serde(default, skip_serializing_if = "Option::is_none")]
2798    pub columns: Option<Vec<String>>,
2799    /// Contract field emit.
2800    #[serde(rename = "emit")]
2801    #[serde(default, skip_serializing_if = "Option::is_none")]
2802    pub emit: Option<Emit>,
2803    /// Contract field execution.
2804    #[serde(rename = "execution")]
2805    #[serde(default, skip_serializing_if = "Option::is_none")]
2806    pub execution: Option<ExecutionOptions>,
2807    /// Contract field filter.
2808    #[serde(rename = "filter")]
2809    #[serde(default, skip_serializing_if = "Option::is_none")]
2810    pub filter: Option<Expression>,
2811    /// Contract field limit.
2812    #[serde(rename = "limit")]
2813    #[serde(default, skip_serializing_if = "Option::is_none")]
2814    pub limit: Option<SafeUnsignedLong>,
2815    /// Contract field projection.
2816    #[serde(rename = "projection")]
2817    #[serde(default, skip_serializing_if = "Option::is_none")]
2818    pub projection: Option<Vec<NamedExpression>>,
2819    /// Contract field rowIdColumn.
2820    #[serde(rename = "rowIdColumn")]
2821    #[serde(default, skip_serializing_if = "Option::is_none")]
2822    pub row_id_column: Option<String>,
2823    /// Contract field rowIds.
2824    #[serde(rename = "rowIds")]
2825    #[serde(default, skip_serializing_if = "Option::is_none")]
2826    pub row_ids: Option<Vec<RowIdRange>>,
2827    /// Contract field rowRange.
2828    #[serde(rename = "rowRange")]
2829    #[serde(default, skip_serializing_if = "Option::is_none")]
2830    pub row_range: Option<RowRange>,
2831    /// Contract field table.
2832    #[serde(rename = "table")]
2833    pub table: TableVersion,
2834}
2835impl<'de> DeserializeStrict<'de> for Scan {
2836    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2837        #[derive(Deserialize)]
2838        #[serde(deny_unknown_fields)]
2839        struct __Wire {
2840            #[serde(rename = "batchRows")]
2841            #[serde(default)]
2842            batch_rows: Strict<Option<u32>>,
2843            #[serde(rename = "collectMetrics")]
2844            #[serde(default)]
2845            collect_metrics: Strict<Option<bool>>,
2846            #[serde(rename = "columns")]
2847            #[serde(default)]
2848            columns: Strict<Option<Vec<String>>>,
2849            #[serde(rename = "emit")]
2850            #[serde(default)]
2851            emit: Strict<Option<Emit>>,
2852            #[serde(rename = "execution")]
2853            #[serde(default)]
2854            execution: Strict<Option<ExecutionOptions>>,
2855            #[serde(rename = "filter")]
2856            #[serde(default)]
2857            filter: Strict<Option<Expression>>,
2858            #[serde(rename = "limit")]
2859            #[serde(default)]
2860            limit: Strict<Option<SafeUnsignedLong>>,
2861            #[serde(rename = "projection")]
2862            #[serde(default)]
2863            projection: Strict<Option<Vec<NamedExpression>>>,
2864            #[serde(rename = "rowIdColumn")]
2865            #[serde(default)]
2866            row_id_column: Strict<Option<String>>,
2867            #[serde(rename = "rowIds")]
2868            #[serde(default)]
2869            row_ids: Strict<Option<Vec<RowIdRange>>>,
2870            #[serde(rename = "rowRange")]
2871            #[serde(default)]
2872            row_range: Strict<Option<RowRange>>,
2873            #[serde(rename = "table")]
2874            table: Strict<TableVersion>,
2875        }
2876        let wire = __Wire::deserialize(deserializer)?;
2877        Ok(Self {
2878            batch_rows: wire.batch_rows.0,
2879            collect_metrics: wire.collect_metrics.0,
2880            columns: wire.columns.0,
2881            emit: wire.emit.0,
2882            execution: wire.execution.0,
2883            filter: wire.filter.0,
2884            limit: wire.limit.0,
2885            projection: wire.projection.0,
2886            row_id_column: wire.row_id_column.0,
2887            row_ids: wire.row_ids.0,
2888            row_range: wire.row_range.0,
2889            table: wire.table.0,
2890        })
2891    }
2892}
2893
2894/// A scan describes its output schema and filter support. An emit uses the schema of its results.
2895/// The sourceFields map relates top-level stored names to stable field identities, independently of
2896/// output projection. Omission means that the host does not expose these identities.
2897#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2898pub struct ScanInfo {
2899    /// Contract field filterClauses.
2900    #[serde(rename = "filterClauses")]
2901    pub filter_clauses: Vec<FilterClause>,
2902    /// Contract field schema.
2903    #[serde(rename = "schema")]
2904    pub schema: ArrowSchema,
2905    /// Contract field sourceFields.
2906    #[serde(rename = "sourceFields")]
2907    #[serde(default, skip_serializing_if = "Option::is_none")]
2908    pub source_fields: Option<BTreeMap<String, Uuid>>,
2909    /// Contract field statistics.
2910    #[serde(rename = "statistics")]
2911    #[serde(default, skip_serializing_if = "Option::is_none")]
2912    pub statistics: Option<ScanStatistics>,
2913    /// Contract field writeLayout.
2914    #[serde(rename = "writeLayout")]
2915    #[serde(default, skip_serializing_if = "Option::is_none")]
2916    pub write_layout: Option<WriteLayout>,
2917}
2918impl<'de> DeserializeStrict<'de> for ScanInfo {
2919    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2920        #[derive(Deserialize)]
2921        #[serde(deny_unknown_fields)]
2922        struct __Wire {
2923            #[serde(rename = "filterClauses")]
2924            filter_clauses: Strict<Vec<FilterClause>>,
2925            #[serde(rename = "schema")]
2926            schema: Strict<ArrowSchema>,
2927            #[serde(rename = "sourceFields")]
2928            #[serde(default)]
2929            source_fields: Strict<Option<BTreeMap<String, Uuid>>>,
2930            #[serde(rename = "statistics")]
2931            #[serde(default)]
2932            statistics: Strict<Option<ScanStatistics>>,
2933            #[serde(rename = "writeLayout")]
2934            #[serde(default)]
2935            write_layout: Strict<Option<WriteLayout>>,
2936        }
2937        let wire = __Wire::deserialize(deserializer)?;
2938        Ok(Self {
2939            filter_clauses: wire.filter_clauses.0,
2940            schema: wire.schema.0,
2941            source_fields: wire.source_fields.0,
2942            statistics: wire.statistics.0,
2943            write_layout: wire.write_layout.0,
2944        })
2945    }
2946}
2947
2948/// Counters for a scan's plan, or for one batch of a split read.
2949#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
2950pub struct ScanMetricsSnapshot {
2951    /// Contract field filesConsidered.
2952    #[serde(rename = "filesConsidered")]
2953    pub files_considered: SafeUnsignedLong,
2954    /// Contract field filesPruned.
2955    #[serde(rename = "filesPruned")]
2956    pub files_pruned: SafeUnsignedLong,
2957    /// Contract field fragmentsConsidered.
2958    #[serde(rename = "fragmentsConsidered")]
2959    pub fragments_considered: SafeUnsignedLong,
2960    /// Contract field fragmentsPruned.
2961    #[serde(rename = "fragmentsPruned")]
2962    pub fragments_pruned: SafeUnsignedLong,
2963    /// Contract field outputRows.
2964    #[serde(rename = "outputRows")]
2965    pub output_rows: SafeUnsignedLong,
2966    /// Contract field storage.
2967    #[serde(rename = "storage")]
2968    #[serde(default, skip_serializing_if = "Option::is_none")]
2969    pub storage: Option<StorageCounters>,
2970    /// Contract field windows.
2971    #[serde(rename = "windows")]
2972    #[serde(default, skip_serializing_if = "Option::is_none")]
2973    pub windows: Option<WindowCounters>,
2974}
2975impl<'de> DeserializeStrict<'de> for ScanMetricsSnapshot {
2976    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
2977        #[derive(Deserialize)]
2978        #[serde(deny_unknown_fields)]
2979        struct __Wire {
2980            #[serde(rename = "filesConsidered")]
2981            files_considered: Strict<SafeUnsignedLong>,
2982            #[serde(rename = "filesPruned")]
2983            files_pruned: Strict<SafeUnsignedLong>,
2984            #[serde(rename = "fragmentsConsidered")]
2985            fragments_considered: Strict<SafeUnsignedLong>,
2986            #[serde(rename = "fragmentsPruned")]
2987            fragments_pruned: Strict<SafeUnsignedLong>,
2988            #[serde(rename = "outputRows")]
2989            output_rows: Strict<SafeUnsignedLong>,
2990            #[serde(rename = "storage")]
2991            #[serde(default)]
2992            storage: Strict<Option<StorageCounters>>,
2993            #[serde(rename = "windows")]
2994            #[serde(default)]
2995            windows: Strict<Option<WindowCounters>>,
2996        }
2997        let wire = __Wire::deserialize(deserializer)?;
2998        Ok(Self {
2999            files_considered: wire.files_considered.0,
3000            files_pruned: wire.files_pruned.0,
3001            fragments_considered: wire.fragments_considered.0,
3002            fragments_pruned: wire.fragments_pruned.0,
3003            output_rows: wire.output_rows.0,
3004            storage: wire.storage.0,
3005            windows: wire.windows.0,
3006        })
3007    }
3008}
3009
3010/// A scan's output and one split for each file that statistics do not prune.
3011#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3012pub struct ScanPlan {
3013    /// Contract field info.
3014    #[serde(rename = "info")]
3015    pub info: ScanInfo,
3016    /// Contract field metrics.
3017    #[serde(rename = "metrics")]
3018    #[serde(default, skip_serializing_if = "Option::is_none")]
3019    pub metrics: Option<ScanMetricsSnapshot>,
3020    /// Contract field splits.
3021    #[serde(rename = "splits")]
3022    pub splits: Vec<PlannedSplit>,
3023}
3024impl<'de> DeserializeStrict<'de> for ScanPlan {
3025    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3026        #[derive(Deserialize)]
3027        #[serde(deny_unknown_fields)]
3028        struct __Wire {
3029            #[serde(rename = "info")]
3030            info: Strict<ScanInfo>,
3031            #[serde(rename = "metrics")]
3032            #[serde(default)]
3033            metrics: Strict<Option<ScanMetricsSnapshot>>,
3034            #[serde(rename = "splits")]
3035            splits: Strict<Vec<PlannedSplit>>,
3036        }
3037        let wire = __Wire::deserialize(deserializer)?;
3038        Ok(Self {
3039            info: wire.info.0,
3040            metrics: wire.metrics.0,
3041            splits: wire.splits.0,
3042        })
3043    }
3044}
3045
3046/// Metadata-only statistics for selected rows. Stored bytes describe storage, not Arrow output
3047/// size.
3048#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3049pub struct ScanStatistics {
3050    /// Contract field columns.
3051    #[serde(rename = "columns")]
3052    pub columns: Vec<ColumnStatistics>,
3053    /// Contract field rowCount.
3054    #[serde(rename = "rowCount")]
3055    #[serde(default, skip_serializing_if = "Option::is_none")]
3056    pub row_count: Option<SafeUnsignedLong>,
3057    /// Contract field rowCountExact.
3058    #[serde(rename = "rowCountExact")]
3059    pub row_count_exact: bool,
3060    /// Contract field storedBytes.
3061    #[serde(rename = "storedBytes")]
3062    #[serde(default, skip_serializing_if = "Option::is_none")]
3063    pub stored_bytes: Option<SafeUnsignedLong>,
3064}
3065impl<'de> DeserializeStrict<'de> for ScanStatistics {
3066    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3067        #[derive(Deserialize)]
3068        #[serde(deny_unknown_fields)]
3069        struct __Wire {
3070            #[serde(rename = "columns")]
3071            columns: Strict<Vec<ColumnStatistics>>,
3072            #[serde(rename = "rowCount")]
3073            #[serde(default)]
3074            row_count: Strict<Option<SafeUnsignedLong>>,
3075            #[serde(rename = "rowCountExact")]
3076            row_count_exact: Strict<bool>,
3077            #[serde(rename = "storedBytes")]
3078            #[serde(default)]
3079            stored_bytes: Strict<Option<SafeUnsignedLong>>,
3080        }
3081        let wire = __Wire::deserialize(deserializer)?;
3082        Ok(Self {
3083            columns: wire.columns.0,
3084            row_count: wire.row_count.0,
3085            row_count_exact: wire.row_count_exact.0,
3086            stored_bytes: wire.stored_bytes.0,
3087        })
3088    }
3089}
3090
3091/// One change to a Table's schema. A path names a top-level column, or a nested field by its
3092/// segments. Changes apply in order and write no data files. An added column or field is nullable;
3093/// a widened type converts without loss, such as `int32` to `int64`; a partition or sort source
3094/// field cannot be dropped.
3095#[derive(Clone, Debug, PartialEq, Eq)]
3096pub enum SchemaChange {
3097    /// A known union arm.
3098    AddColumn(AddColumn),
3099    /// A known union arm.
3100    DropColumn(ColumnPath),
3101    /// A known union arm.
3102    MoveColumn(MoveColumn),
3103    /// A known union arm.
3104    RenameColumn(RenameColumn),
3105    /// A known union arm.
3106    SetNullable(ColumnPath),
3107    /// A known union arm.
3108    WidenType(WidenType),
3109    /// An unknown discriminator and its complete wire object.
3110    Unknown { tag: String, value: Value },
3111}
3112impl Serialize for SchemaChange {
3113    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3114        match self {
3115            Self::AddColumn(value) => {
3116                let mut object = serde_json::Map::new();
3117                object.insert("type".into(), Value::String("addColumn".into()));
3118                object.insert(
3119                    "addColumn".into(),
3120                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
3121                );
3122                Value::Object(object).serialize(serializer)
3123            }
3124            Self::DropColumn(value) => {
3125                let mut object = serde_json::Map::new();
3126                object.insert("type".into(), Value::String("dropColumn".into()));
3127                object.insert(
3128                    "dropColumn".into(),
3129                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
3130                );
3131                Value::Object(object).serialize(serializer)
3132            }
3133            Self::MoveColumn(value) => {
3134                let mut object = serde_json::Map::new();
3135                object.insert("type".into(), Value::String("moveColumn".into()));
3136                object.insert(
3137                    "moveColumn".into(),
3138                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
3139                );
3140                Value::Object(object).serialize(serializer)
3141            }
3142            Self::RenameColumn(value) => {
3143                let mut object = serde_json::Map::new();
3144                object.insert("type".into(), Value::String("renameColumn".into()));
3145                object.insert(
3146                    "renameColumn".into(),
3147                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
3148                );
3149                Value::Object(object).serialize(serializer)
3150            }
3151            Self::SetNullable(value) => {
3152                let mut object = serde_json::Map::new();
3153                object.insert("type".into(), Value::String("setNullable".into()));
3154                object.insert(
3155                    "setNullable".into(),
3156                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
3157                );
3158                Value::Object(object).serialize(serializer)
3159            }
3160            Self::WidenType(value) => {
3161                let mut object = serde_json::Map::new();
3162                object.insert("type".into(), Value::String("widenType".into()));
3163                object.insert(
3164                    "widenType".into(),
3165                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
3166                );
3167                Value::Object(object).serialize(serializer)
3168            }
3169            Self::Unknown { tag, value } => {
3170                if value.get("type").and_then(Value::as_str) != Some(tag.as_str()) {
3171                    return Err(serde::ser::Error::custom(
3172                        "unknown union discriminator mismatch",
3173                    ));
3174                }
3175                value.serialize(serializer)
3176            }
3177        }
3178    }
3179}
3180impl<'de> Deserialize<'de> for SchemaChange {
3181    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3182        let value = Value::deserialize(deserializer)?;
3183        let tag = value
3184            .get("type")
3185            .and_then(Value::as_str)
3186            .ok_or_else(|| serde::de::Error::custom("union requires type"))?;
3187        match tag {
3188            "addColumn" => Ok(Self::AddColumn(
3189                serde_json::from_value(
3190                    value
3191                        .get("addColumn")
3192                        .cloned()
3193                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
3194                )
3195                .map_err(serde::de::Error::custom)?,
3196            )),
3197            "dropColumn" => Ok(Self::DropColumn(
3198                serde_json::from_value(
3199                    value
3200                        .get("dropColumn")
3201                        .cloned()
3202                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
3203                )
3204                .map_err(serde::de::Error::custom)?,
3205            )),
3206            "moveColumn" => Ok(Self::MoveColumn(
3207                serde_json::from_value(
3208                    value
3209                        .get("moveColumn")
3210                        .cloned()
3211                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
3212                )
3213                .map_err(serde::de::Error::custom)?,
3214            )),
3215            "renameColumn" => Ok(Self::RenameColumn(
3216                serde_json::from_value(
3217                    value
3218                        .get("renameColumn")
3219                        .cloned()
3220                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
3221                )
3222                .map_err(serde::de::Error::custom)?,
3223            )),
3224            "setNullable" => Ok(Self::SetNullable(
3225                serde_json::from_value(
3226                    value
3227                        .get("setNullable")
3228                        .cloned()
3229                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
3230                )
3231                .map_err(serde::de::Error::custom)?,
3232            )),
3233            "widenType" => Ok(Self::WidenType(
3234                serde_json::from_value(
3235                    value
3236                        .get("widenType")
3237                        .cloned()
3238                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
3239                )
3240                .map_err(serde::de::Error::custom)?,
3241            )),
3242            tag => Ok(Self::Unknown {
3243                tag: tag.to_owned(),
3244                value,
3245            }),
3246        }
3247    }
3248}
3249impl<'de> DeserializeStrict<'de> for SchemaChange {
3250    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3251        #[derive(Deserialize)]
3252        enum __Tag0 {
3253            #[serde(rename = "addColumn")]
3254            Value,
3255        }
3256        #[derive(Deserialize)]
3257        #[serde(deny_unknown_fields)]
3258        struct __Arm0 {
3259            #[serde(rename = "type")]
3260            _tag: __Tag0,
3261            #[serde(rename = "addColumn")]
3262            value: Strict<AddColumn>,
3263        }
3264        #[derive(Deserialize)]
3265        enum __Tag1 {
3266            #[serde(rename = "dropColumn")]
3267            Value,
3268        }
3269        #[derive(Deserialize)]
3270        #[serde(deny_unknown_fields)]
3271        struct __Arm1 {
3272            #[serde(rename = "type")]
3273            _tag: __Tag1,
3274            #[serde(rename = "dropColumn")]
3275            value: Strict<ColumnPath>,
3276        }
3277        #[derive(Deserialize)]
3278        enum __Tag2 {
3279            #[serde(rename = "moveColumn")]
3280            Value,
3281        }
3282        #[derive(Deserialize)]
3283        #[serde(deny_unknown_fields)]
3284        struct __Arm2 {
3285            #[serde(rename = "type")]
3286            _tag: __Tag2,
3287            #[serde(rename = "moveColumn")]
3288            value: Strict<MoveColumn>,
3289        }
3290        #[derive(Deserialize)]
3291        enum __Tag3 {
3292            #[serde(rename = "renameColumn")]
3293            Value,
3294        }
3295        #[derive(Deserialize)]
3296        #[serde(deny_unknown_fields)]
3297        struct __Arm3 {
3298            #[serde(rename = "type")]
3299            _tag: __Tag3,
3300            #[serde(rename = "renameColumn")]
3301            value: Strict<RenameColumn>,
3302        }
3303        #[derive(Deserialize)]
3304        enum __Tag4 {
3305            #[serde(rename = "setNullable")]
3306            Value,
3307        }
3308        #[derive(Deserialize)]
3309        #[serde(deny_unknown_fields)]
3310        struct __Arm4 {
3311            #[serde(rename = "type")]
3312            _tag: __Tag4,
3313            #[serde(rename = "setNullable")]
3314            value: Strict<ColumnPath>,
3315        }
3316        #[derive(Deserialize)]
3317        enum __Tag5 {
3318            #[serde(rename = "widenType")]
3319            Value,
3320        }
3321        #[derive(Deserialize)]
3322        #[serde(deny_unknown_fields)]
3323        struct __Arm5 {
3324            #[serde(rename = "type")]
3325            _tag: __Tag5,
3326            #[serde(rename = "widenType")]
3327            value: Strict<WidenType>,
3328        }
3329        #[derive(Deserialize)]
3330        #[serde(untagged)]
3331        enum __Known {
3332            AddColumn(Box<__Arm0>),
3333            DropColumn(Box<__Arm1>),
3334            MoveColumn(Box<__Arm2>),
3335            RenameColumn(Box<__Arm3>),
3336            SetNullable(Box<__Arm4>),
3337            WidenType(Box<__Arm5>),
3338        }
3339        Ok(match __Known::deserialize(deserializer)? {
3340            __Known::AddColumn(arm) => Self::AddColumn(arm.value.0),
3341            __Known::DropColumn(arm) => Self::DropColumn(arm.value.0),
3342            __Known::MoveColumn(arm) => Self::MoveColumn(arm.value.0),
3343            __Known::RenameColumn(arm) => Self::RenameColumn(arm.value.0),
3344            __Known::SetNullable(arm) => Self::SetNullable(arm.value.0),
3345            __Known::WidenType(arm) => Self::WidenType(arm.value.0),
3346        })
3347    }
3348}
3349
3350/// Search one exact index and the source version from its origin. The result has at most 1000 rows.
3351/// Rerank caps candidates at 100000, including excluded rows. The source filter and exclusions
3352/// apply before the final top-k selection. Columns select final source fields. Omission returns
3353/// only row IDs, distances, and ranks. Query coordinates and exact source distances use float64.
3354/// Candidate selection uses float32. Unsupported filters fail before payload reads. Codec v2
3355/// requires a resource refresh before this operation.
3356#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
3357pub struct SearchVectorsRequest {
3358    /// Contract field columns.
3359    #[serde(rename = "columns")]
3360    #[serde(default, skip_serializing_if = "Option::is_none")]
3361    pub columns: Option<Vec<String>>,
3362    /// Contract field excludeRowIds.
3363    #[serde(rename = "excludeRowIds")]
3364    #[serde(default, skip_serializing_if = "Option::is_none")]
3365    pub exclude_row_ids: Option<Vec<SafeUnsignedLong>>,
3366    /// Contract field filter.
3367    #[serde(rename = "filter")]
3368    #[serde(default, skip_serializing_if = "Option::is_none")]
3369    pub filter: Option<Expression>,
3370    /// Contract field index.
3371    #[serde(rename = "index")]
3372    pub index: VectorIndexArtifact,
3373    /// Contract field indexStorage.
3374    #[serde(rename = "indexStorage")]
3375    pub index_storage: StorageBinding,
3376    /// Contract field limit.
3377    #[serde(rename = "limit")]
3378    pub limit: u32,
3379    /// Contract field probes.
3380    #[serde(rename = "probes")]
3381    #[serde(default, skip_serializing_if = "Option::is_none")]
3382    pub probes: Option<u32>,
3383    /// Contract field query.
3384    #[serde(rename = "query")]
3385    pub query: Vec<f64>,
3386    /// Contract field rerank.
3387    #[serde(rename = "rerank")]
3388    #[serde(default, skip_serializing_if = "Option::is_none")]
3389    pub rerank: Option<u32>,
3390    /// Contract field sourceStorage.
3391    #[serde(rename = "sourceStorage")]
3392    pub source_storage: StorageBinding,
3393}
3394impl<'de> DeserializeStrict<'de> for SearchVectorsRequest {
3395    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3396        #[derive(Deserialize)]
3397        #[serde(deny_unknown_fields)]
3398        struct __Wire {
3399            #[serde(rename = "columns")]
3400            #[serde(default)]
3401            columns: Strict<Option<Vec<String>>>,
3402            #[serde(rename = "excludeRowIds")]
3403            #[serde(default)]
3404            exclude_row_ids: Strict<Option<Vec<SafeUnsignedLong>>>,
3405            #[serde(rename = "filter")]
3406            #[serde(default)]
3407            filter: Strict<Option<Expression>>,
3408            #[serde(rename = "index")]
3409            index: Strict<VectorIndexArtifact>,
3410            #[serde(rename = "indexStorage")]
3411            index_storage: Strict<StorageBinding>,
3412            #[serde(rename = "limit")]
3413            limit: Strict<u32>,
3414            #[serde(rename = "probes")]
3415            #[serde(default)]
3416            probes: Strict<Option<u32>>,
3417            #[serde(rename = "query")]
3418            query: Strict<Vec<f64>>,
3419            #[serde(rename = "rerank")]
3420            #[serde(default)]
3421            rerank: Strict<Option<u32>>,
3422            #[serde(rename = "sourceStorage")]
3423            source_storage: Strict<StorageBinding>,
3424        }
3425        let wire = __Wire::deserialize(deserializer)?;
3426        Ok(Self {
3427            columns: wire.columns.0,
3428            exclude_row_ids: wire.exclude_row_ids.0,
3429            filter: wire.filter.0,
3430            index: wire.index.0,
3431            index_storage: wire.index_storage.0,
3432            limit: wire.limit.0,
3433            probes: wire.probes.0,
3434            query: wire.query.0,
3435            rerank: wire.rerank.0,
3436            source_storage: wire.source_storage.0,
3437        })
3438    }
3439}
3440
3441/// One output column's comparison order within a stored fragment.
3442#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3443pub struct SortColumn {
3444    /// Contract field descending.
3445    #[serde(rename = "descending")]
3446    pub descending: bool,
3447    /// Contract field nullsFirst.
3448    #[serde(rename = "nullsFirst")]
3449    pub nulls_first: bool,
3450    /// Contract field path.
3451    #[serde(rename = "path")]
3452    pub path: Vec<String>,
3453    /// Contract field transform.
3454    #[serde(rename = "transform")]
3455    #[serde(default, skip_serializing_if = "Option::is_none")]
3456    pub transform: Option<String>,
3457}
3458impl<'de> DeserializeStrict<'de> for SortColumn {
3459    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3460        #[derive(Deserialize)]
3461        #[serde(deny_unknown_fields)]
3462        struct __Wire {
3463            #[serde(rename = "descending")]
3464            descending: Strict<bool>,
3465            #[serde(rename = "nullsFirst")]
3466            nulls_first: Strict<bool>,
3467            #[serde(rename = "path")]
3468            path: Strict<Vec<String>>,
3469            #[serde(rename = "transform")]
3470            #[serde(default)]
3471            transform: Strict<Option<String>>,
3472        }
3473        let wire = __Wire::deserialize(deserializer)?;
3474        Ok(Self {
3475            descending: wire.descending.0,
3476            nulls_first: wire.nulls_first.0,
3477            path: wire.path.0,
3478            transform: wire.transform.0,
3479        })
3480    }
3481}
3482
3483/// An output column that a top-k orders by. Nulls sort last ascending and first descending, unless
3484/// `nullsFirst` says otherwise.
3485#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3486pub struct SortKey {
3487    /// Contract field column.
3488    #[serde(rename = "column")]
3489    pub column: String,
3490    /// Contract field descending.
3491    #[serde(rename = "descending")]
3492    #[serde(default, skip_serializing_if = "Option::is_none")]
3493    pub descending: Option<bool>,
3494    /// Contract field nullsFirst.
3495    #[serde(rename = "nullsFirst")]
3496    #[serde(default, skip_serializing_if = "Option::is_none")]
3497    pub nulls_first: Option<bool>,
3498}
3499impl<'de> DeserializeStrict<'de> for SortKey {
3500    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3501        #[derive(Deserialize)]
3502        #[serde(deny_unknown_fields)]
3503        struct __Wire {
3504            #[serde(rename = "column")]
3505            column: Strict<String>,
3506            #[serde(rename = "descending")]
3507            #[serde(default)]
3508            descending: Strict<Option<bool>>,
3509            #[serde(rename = "nullsFirst")]
3510            #[serde(default)]
3511            nulls_first: Strict<Option<bool>>,
3512        }
3513        let wire = __Wire::deserialize(deserializer)?;
3514        Ok(Self {
3515            column: wire.column.0,
3516            descending: wire.descending.0,
3517            nulls_first: wire.nulls_first.0,
3518        })
3519    }
3520}
3521
3522/// Stored rows of one file of the scanned version. Stored rows include rows that a later version
3523/// deleted; a read skips them. Resume a split by raising `rows.start` to the last row a read
3524/// reported, and share one between readers by dividing `rows`.
3525#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3526pub struct Split {
3527    /// Contract field fragment.
3528    #[serde(rename = "fragment")]
3529    pub fragment: SafeUnsignedLong,
3530    /// Contract field rows.
3531    #[serde(rename = "rows")]
3532    pub rows: RowRange,
3533}
3534impl<'de> DeserializeStrict<'de> for Split {
3535    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3536        #[derive(Deserialize)]
3537        #[serde(deny_unknown_fields)]
3538        struct __Wire {
3539            #[serde(rename = "fragment")]
3540            fragment: Strict<SafeUnsignedLong>,
3541            #[serde(rename = "rows")]
3542            rows: Strict<RowRange>,
3543        }
3544        let wire = __Wire::deserialize(deserializer)?;
3545        Ok(Self {
3546            fragment: wire.fragment.0,
3547            rows: wire.rows.0,
3548        })
3549    }
3550}
3551
3552/// Rows of one planned split, by position. Position `p` is the `p`-th row of the split, counted
3553/// from zero in stored order, that the scanned version keeps after deleted rows are removed;
3554/// `count_rows` over the split gives how many there are. Positions may come in any order and
3555/// repeat.
3556#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3557pub struct SplitTake {
3558    /// Contract field positions.
3559    #[serde(rename = "positions")]
3560    pub positions: Vec<SafeUnsignedLong>,
3561    /// Contract field split.
3562    #[serde(rename = "split")]
3563    pub split: Split,
3564}
3565impl<'de> DeserializeStrict<'de> for SplitTake {
3566    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3567        #[derive(Deserialize)]
3568        #[serde(deny_unknown_fields)]
3569        struct __Wire {
3570            #[serde(rename = "positions")]
3571            positions: Strict<Vec<SafeUnsignedLong>>,
3572            #[serde(rename = "split")]
3573            split: Strict<Split>,
3574        }
3575        let wire = __Wire::deserialize(deserializer)?;
3576        Ok(Self {
3577            positions: wire.positions.0,
3578            split: wire.split.0,
3579        })
3580    }
3581}
3582
3583/// The Table and write attempt to upload into, with the attempt's binding from the Tables API.
3584/// `partBytes` is a power of two from 8 MiB to 1 GiB, 64 MiB unless set, and at most a request's
3585/// memory budget; an upload holds at most 10,000 parts.
3586#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3587pub struct StartBlobUploadRequest {
3588    /// Contract field attempt.
3589    #[serde(rename = "attempt")]
3590    pub attempt: Uuid,
3591    /// Contract field mediaType.
3592    #[serde(rename = "mediaType")]
3593    pub media_type: String,
3594    /// Contract field partBytes.
3595    #[serde(rename = "partBytes")]
3596    #[serde(default, skip_serializing_if = "Option::is_none")]
3597    pub part_bytes: Option<SafeUnsignedLong>,
3598    /// Contract field table.
3599    #[serde(rename = "table")]
3600    pub table: TableBinding,
3601}
3602impl<'de> DeserializeStrict<'de> for StartBlobUploadRequest {
3603    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3604        #[derive(Deserialize)]
3605        #[serde(deny_unknown_fields)]
3606        struct __Wire {
3607            #[serde(rename = "attempt")]
3608            attempt: Strict<Uuid>,
3609            #[serde(rename = "mediaType")]
3610            media_type: Strict<String>,
3611            #[serde(rename = "partBytes")]
3612            #[serde(default)]
3613            part_bytes: Strict<Option<SafeUnsignedLong>>,
3614            #[serde(rename = "table")]
3615            table: Strict<TableBinding>,
3616        }
3617        let wire = __Wire::deserialize(deserializer)?;
3618        Ok(Self {
3619            attempt: wire.attempt.0,
3620            media_type: wire.media_type.0,
3621            part_bytes: wire.part_bytes.0,
3622            table: wire.table.0,
3623        })
3624    }
3625}
3626
3627/// StatBlobRequest contract value.
3628#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3629pub struct StatBlobRequest {
3630    /// Contract field blob.
3631    #[serde(rename = "blob")]
3632    pub blob: Blob,
3633    /// Contract field storage.
3634    #[serde(rename = "storage")]
3635    #[serde(default, skip_serializing_if = "Option::is_none")]
3636    pub storage: Option<StorageBinding>,
3637}
3638impl<'de> DeserializeStrict<'de> for StatBlobRequest {
3639    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3640        #[derive(Deserialize)]
3641        #[serde(deny_unknown_fields)]
3642        struct __Wire {
3643            #[serde(rename = "blob")]
3644            blob: Strict<Blob>,
3645            #[serde(rename = "storage")]
3646            #[serde(default)]
3647            storage: Strict<Option<StorageBinding>>,
3648        }
3649        let wire = __Wire::deserialize(deserializer)?;
3650        Ok(Self {
3651            blob: wire.blob.0,
3652            storage: wire.storage.0,
3653        })
3654    }
3655}
3656
3657/// Access to one Table's storage, built from what the Tables API returns for storage access.
3658/// `endpoint` is the SPFS endpoint that signs an SPFS root's requests; without one, the host's own
3659/// SPFS endpoint signs them. The host configures allowed storage providers and endpoints; hosted
3660/// ScanDAL refuses local file roots and any storage endpoint but its own. A host that resolved a
3661/// binding requests it again before `expiresAt`, Unix seconds; without one, the binding lasts as
3662/// long as its credential. A host that reads provider roots reads a read-only binding's
3663/// `directRead` at the provider instead of through SPFS.
3664#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3665pub struct StorageBinding {
3666    /// Contract field credential.
3667    #[serde(rename = "credential")]
3668    #[serde(default, skip_serializing_if = "Option::is_none")]
3669    pub credential: Option<StorageCredential>,
3670    /// Contract field directRead.
3671    #[serde(rename = "directRead")]
3672    #[serde(default, skip_serializing_if = "Option::is_none")]
3673    pub direct_read: Option<DirectRead>,
3674    /// Contract field endpoint.
3675    #[serde(rename = "endpoint")]
3676    #[serde(default, skip_serializing_if = "Option::is_none")]
3677    pub endpoint: Option<String>,
3678    /// Contract field expiresAt.
3679    #[serde(rename = "expiresAt")]
3680    #[serde(default, skip_serializing_if = "Option::is_none")]
3681    pub expires_at: Option<SafeUnsignedLong>,
3682    /// Contract field rootAlias.
3683    #[serde(rename = "rootAlias")]
3684    #[serde(default, skip_serializing_if = "Option::is_none")]
3685    pub root_alias: Option<String>,
3686    /// Contract field rootUri.
3687    #[serde(rename = "rootUri")]
3688    pub root_uri: String,
3689}
3690impl<'de> DeserializeStrict<'de> for StorageBinding {
3691    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3692        #[derive(Deserialize)]
3693        #[serde(deny_unknown_fields)]
3694        struct __Wire {
3695            #[serde(rename = "credential")]
3696            #[serde(default)]
3697            credential: Strict<Option<StorageCredential>>,
3698            #[serde(rename = "directRead")]
3699            #[serde(default)]
3700            direct_read: Strict<Option<DirectRead>>,
3701            #[serde(rename = "endpoint")]
3702            #[serde(default)]
3703            endpoint: Strict<Option<String>>,
3704            #[serde(rename = "expiresAt")]
3705            #[serde(default)]
3706            expires_at: Strict<Option<SafeUnsignedLong>>,
3707            #[serde(rename = "rootAlias")]
3708            #[serde(default)]
3709            root_alias: Strict<Option<String>>,
3710            #[serde(rename = "rootUri")]
3711            root_uri: Strict<String>,
3712        }
3713        let wire = __Wire::deserialize(deserializer)?;
3714        Ok(Self {
3715            credential: wire.credential.0,
3716            direct_read: wire.direct_read.0,
3717            endpoint: wire.endpoint.0,
3718            expires_at: wire.expires_at.0,
3719            root_alias: wire.root_alias.0,
3720            root_uri: wire.root_uri.0,
3721        })
3722    }
3723}
3724
3725/// Successful object reads of one scan or split read.
3726#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3727pub struct StorageCounters {
3728    /// Contract field bytes.
3729    #[serde(rename = "bytes")]
3730    pub bytes: SafeUnsignedLong,
3731    /// Contract field readTimeNs.
3732    #[serde(rename = "readTimeNs")]
3733    pub read_time_ns: SafeUnsignedLong,
3734    /// Contract field requests.
3735    #[serde(rename = "requests")]
3736    pub requests: SafeUnsignedLong,
3737    /// Contract field scope.
3738    #[serde(rename = "scope")]
3739    pub scope: StorageScope,
3740}
3741impl<'de> DeserializeStrict<'de> for StorageCounters {
3742    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3743        #[derive(Deserialize)]
3744        #[serde(deny_unknown_fields)]
3745        struct __Wire {
3746            #[serde(rename = "bytes")]
3747            bytes: Strict<SafeUnsignedLong>,
3748            #[serde(rename = "readTimeNs")]
3749            read_time_ns: Strict<SafeUnsignedLong>,
3750            #[serde(rename = "requests")]
3751            requests: Strict<SafeUnsignedLong>,
3752            #[serde(rename = "scope")]
3753            scope: Strict<StorageScope>,
3754        }
3755        let wire = __Wire::deserialize(deserializer)?;
3756        Ok(Self {
3757            bytes: wire.bytes.0,
3758            read_time_ns: wire.read_time_ns.0,
3759            requests: wire.requests.0,
3760            scope: wire.scope.0,
3761        })
3762    }
3763}
3764
3765/// The storage access token for signed access. Generated code keeps it out of debug output.
3766#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)]
3767#[serde(transparent)]
3768pub struct StorageCredential(pub String);
3769impl std::fmt::Debug for StorageCredential {
3770    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3771        formatter.write_str("StorageCredential(<redacted>)")
3772    }
3773}
3774impl<'de> DeserializeStrict<'de> for StorageCredential {
3775    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3776        Ok(Self(Strict::<String>::deserialize(deserializer)?.0))
3777    }
3778}
3779
3780/// The reads that storage counters cover.
3781#[derive(Clone, Debug, PartialEq, Eq)]
3782pub enum StorageScope {
3783    /// A known contract value.
3784    Complete,
3785    /// A known contract value.
3786    Direct,
3787    /// A value introduced by a newer server.
3788    Unknown(String),
3789}
3790impl Serialize for StorageScope {
3791    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
3792        serializer.serialize_str(match self {
3793            Self::Complete => "complete",
3794            Self::Direct => "direct",
3795            Self::Unknown(value) => value,
3796        })
3797    }
3798}
3799impl<'de> Deserialize<'de> for StorageScope {
3800    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3801        Ok(match String::deserialize(deserializer)?.as_str() {
3802            "complete" => Self::Complete,
3803            "direct" => Self::Direct,
3804            value => Self::Unknown(value.to_owned()),
3805        })
3806    }
3807}
3808impl<'de> DeserializeStrict<'de> for StorageScope {
3809    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3810        #[derive(Deserialize)]
3811        enum __Known {
3812            #[serde(rename = "complete")]
3813            Complete,
3814            #[serde(rename = "direct")]
3815            Direct,
3816        }
3817        Ok(match __Known::deserialize(deserializer)? {
3818            __Known::Complete => Self::Complete,
3819            __Known::Direct => Self::Direct,
3820        })
3821    }
3822}
3823
3824/// The version a successor builds on.
3825#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3826pub struct SuccessorBase {
3827    /// Contract field versionId.
3828    #[serde(rename = "versionId")]
3829    pub version_id: Uuid,
3830}
3831impl<'de> DeserializeStrict<'de> for SuccessorBase {
3832    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3833        #[derive(Deserialize)]
3834        #[serde(deny_unknown_fields)]
3835        struct __Wire {
3836            #[serde(rename = "versionId")]
3837            version_id: Strict<Uuid>,
3838        }
3839        let wire = __Wire::deserialize(deserializer)?;
3840        Ok(Self {
3841            version_id: wire.version_id.0,
3842        })
3843    }
3844}
3845
3846/// A Table identity and optional explicit storage. The host resolves omitted storage as the caller.
3847#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3848pub struct TableBinding {
3849    /// Contract field storage.
3850    #[serde(rename = "storage")]
3851    #[serde(default, skip_serializing_if = "Option::is_none")]
3852    pub storage: Option<StorageBinding>,
3853    /// Contract field tableId.
3854    #[serde(rename = "tableId")]
3855    pub table_id: Uuid,
3856}
3857impl<'de> DeserializeStrict<'de> for TableBinding {
3858    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3859        #[derive(Deserialize)]
3860        #[serde(deny_unknown_fields)]
3861        struct __Wire {
3862            #[serde(rename = "storage")]
3863            #[serde(default)]
3864            storage: Strict<Option<StorageBinding>>,
3865            #[serde(rename = "tableId")]
3866            table_id: Strict<Uuid>,
3867        }
3868        let wire = __Wire::deserialize(deserializer)?;
3869        Ok(Self {
3870            storage: wire.storage.0,
3871            table_id: wire.table_id.0,
3872        })
3873    }
3874}
3875
3876/// An exact, immutable version of one Table.
3877#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3878pub struct TableVersion {
3879    /// Contract field resourceId.
3880    #[serde(rename = "resourceId")]
3881    pub resource_id: Uuid,
3882    /// Contract field versionId.
3883    #[serde(rename = "versionId")]
3884    pub version_id: Uuid,
3885}
3886impl<'de> DeserializeStrict<'de> for TableVersion {
3887    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3888        #[derive(Deserialize)]
3889        #[serde(deny_unknown_fields)]
3890        struct __Wire {
3891            #[serde(rename = "resourceId")]
3892            resource_id: Strict<Uuid>,
3893            #[serde(rename = "versionId")]
3894            version_id: Strict<Uuid>,
3895        }
3896        let wire = __Wire::deserialize(deserializer)?;
3897        Ok(Self {
3898            resource_id: wire.resource_id.0,
3899            version_id: wire.version_id.0,
3900        })
3901    }
3902}
3903
3904/// Takes of a scan's rows, read in order. The scan's columns or projection, `batchRows` and
3905/// `collectMetrics` apply; a scan with a `filter`, `limit` or `emit` is invalid. A request takes at
3906/// most 65,536 positions from at most 256 splits.
3907#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
3908pub struct TakeRowsRequest {
3909    /// Contract field scan.
3910    #[serde(rename = "scan")]
3911    pub scan: Scan,
3912    /// Contract field storage.
3913    #[serde(rename = "storage")]
3914    #[serde(default, skip_serializing_if = "Option::is_none")]
3915    pub storage: Option<StorageBinding>,
3916    /// Contract field takes.
3917    #[serde(rename = "takes")]
3918    pub takes: Vec<SplitTake>,
3919}
3920impl<'de> DeserializeStrict<'de> for TakeRowsRequest {
3921    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3922        #[derive(Deserialize)]
3923        #[serde(deny_unknown_fields)]
3924        struct __Wire {
3925            #[serde(rename = "scan")]
3926            scan: Strict<Scan>,
3927            #[serde(rename = "storage")]
3928            #[serde(default)]
3929            storage: Strict<Option<StorageBinding>>,
3930            #[serde(rename = "takes")]
3931            takes: Strict<Vec<SplitTake>>,
3932        }
3933        let wire = __Wire::deserialize(deserializer)?;
3934        Ok(Self {
3935            scan: wire.scan.0,
3936            storage: wire.storage.0,
3937            takes: wire.takes.0,
3938        })
3939    }
3940}
3941
3942/// The `k` rows that sort first by `keys`, with every output column, ties in stored order. `k` is
3943/// at most 10,000; order more rows in your own engine. A split selects its winners in one pass over
3944/// the key columns, then reads the other output columns of those rows only. When the first key is a
3945/// stored column, the pass skips rows, and whole zones by their statistics, that sort after the
3946/// worst winner so far. Keys are boolean, numeric, decimal, temporal, string or binary columns.
3947#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3948pub struct TopK {
3949    /// Contract field k.
3950    #[serde(rename = "k")]
3951    pub k: u32,
3952    /// Contract field keys.
3953    #[serde(rename = "keys")]
3954    pub keys: Vec<SortKey>,
3955}
3956impl<'de> DeserializeStrict<'de> for TopK {
3957    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3958        #[derive(Deserialize)]
3959        #[serde(deny_unknown_fields)]
3960        struct __Wire {
3961            #[serde(rename = "k")]
3962            k: Strict<u32>,
3963            #[serde(rename = "keys")]
3964            keys: Strict<Vec<SortKey>>,
3965        }
3966        let wire = __Wire::deserialize(deserializer)?;
3967        Ok(Self {
3968            k: wire.k.0,
3969            keys: wire.keys.0,
3970        })
3971    }
3972}
3973
3974/// One part of an upload: `part` counts from 1 and covers the payload's bytes from `(part - 1) *
3975/// partBytes`.
3976#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
3977pub struct UploadBlobPartRequest {
3978    /// Contract field part.
3979    #[serde(rename = "part")]
3980    pub part: u32,
3981    /// Contract field storage.
3982    #[serde(rename = "storage")]
3983    #[serde(default, skip_serializing_if = "Option::is_none")]
3984    pub storage: Option<StorageBinding>,
3985    /// Contract field upload.
3986    #[serde(rename = "upload")]
3987    pub upload: BlobUpload,
3988}
3989impl<'de> DeserializeStrict<'de> for UploadBlobPartRequest {
3990    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
3991        #[derive(Deserialize)]
3992        #[serde(deny_unknown_fields)]
3993        struct __Wire {
3994            #[serde(rename = "part")]
3995            part: Strict<u32>,
3996            #[serde(rename = "storage")]
3997            #[serde(default)]
3998            storage: Strict<Option<StorageBinding>>,
3999            #[serde(rename = "upload")]
4000            upload: Strict<BlobUpload>,
4001        }
4002        let wire = __Wire::deserialize(deserializer)?;
4003        Ok(Self {
4004            part: wire.part.0,
4005            storage: wire.storage.0,
4006            upload: wire.upload.0,
4007        })
4008    }
4009}
4010
4011/// An exact index artifact from the Vector Index service. The manifest must agree with every
4012/// identity and physical attribute.
4013#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
4014pub struct VectorIndexArtifact {
4015    /// Contract field codec.
4016    #[serde(rename = "codec")]
4017    pub codec: String,
4018    /// Contract field codecVersion.
4019    #[serde(rename = "codecVersion")]
4020    pub codec_version: u32,
4021    /// Contract field dimensions.
4022    #[serde(rename = "dimensions")]
4023    pub dimensions: u32,
4024    /// Contract field indexedRows.
4025    #[serde(rename = "indexedRows")]
4026    pub indexed_rows: SafeUnsignedLong,
4027    /// Contract field manifestPath.
4028    #[serde(rename = "manifestPath")]
4029    pub manifest_path: String,
4030    /// Contract field metadata.
4031    #[serde(rename = "metadata")]
4032    pub metadata: String,
4033    /// Contract field metric.
4034    #[serde(rename = "metric")]
4035    pub metric: VectorMetric,
4036    /// Contract field origin.
4037    #[serde(rename = "origin")]
4038    pub origin: VectorIndexOrigin,
4039    /// Contract field partitions.
4040    #[serde(rename = "partitions")]
4041    pub partitions: u32,
4042}
4043impl<'de> DeserializeStrict<'de> for VectorIndexArtifact {
4044    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4045        #[derive(Deserialize)]
4046        #[serde(deny_unknown_fields)]
4047        struct __Wire {
4048            #[serde(rename = "codec")]
4049            codec: Strict<String>,
4050            #[serde(rename = "codecVersion")]
4051            codec_version: Strict<u32>,
4052            #[serde(rename = "dimensions")]
4053            dimensions: Strict<u32>,
4054            #[serde(rename = "indexedRows")]
4055            indexed_rows: Strict<SafeUnsignedLong>,
4056            #[serde(rename = "manifestPath")]
4057            manifest_path: Strict<String>,
4058            #[serde(rename = "metadata")]
4059            metadata: Strict<String>,
4060            #[serde(rename = "metric")]
4061            metric: Strict<VectorMetric>,
4062            #[serde(rename = "origin")]
4063            origin: Strict<VectorIndexOrigin>,
4064            #[serde(rename = "partitions")]
4065            partitions: Strict<u32>,
4066        }
4067        let wire = __Wire::deserialize(deserializer)?;
4068        Ok(Self {
4069            codec: wire.codec.0,
4070            codec_version: wire.codec_version.0,
4071            dimensions: wire.dimensions.0,
4072            indexed_rows: wire.indexed_rows.0,
4073            manifest_path: wire.manifest_path.0,
4074            metadata: wire.metadata.0,
4075            metric: wire.metric.0,
4076            origin: wire.origin.0,
4077            partitions: wire.partitions.0,
4078        })
4079    }
4080}
4081
4082/// Exact identities that an immutable resource artifact records.
4083#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
4084pub struct VectorIndexOrigin {
4085    /// Contract field sourceFieldId.
4086    #[serde(rename = "sourceFieldId")]
4087    pub source_field_id: Uuid,
4088    /// Contract field sourceResourceId.
4089    #[serde(rename = "sourceResourceId")]
4090    pub source_resource_id: Uuid,
4091    /// Contract field sourceVersionId.
4092    #[serde(rename = "sourceVersionId")]
4093    pub source_version_id: Uuid,
4094    /// Contract field vectorIndexId.
4095    #[serde(rename = "vectorIndexId")]
4096    pub vector_index_id: Uuid,
4097    /// Contract field versionId.
4098    #[serde(rename = "versionId")]
4099    pub version_id: Uuid,
4100}
4101impl<'de> DeserializeStrict<'de> for VectorIndexOrigin {
4102    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4103        #[derive(Deserialize)]
4104        #[serde(deny_unknown_fields)]
4105        struct __Wire {
4106            #[serde(rename = "sourceFieldId")]
4107            source_field_id: Strict<Uuid>,
4108            #[serde(rename = "sourceResourceId")]
4109            source_resource_id: Strict<Uuid>,
4110            #[serde(rename = "sourceVersionId")]
4111            source_version_id: Strict<Uuid>,
4112            #[serde(rename = "vectorIndexId")]
4113            vector_index_id: Strict<Uuid>,
4114            #[serde(rename = "versionId")]
4115            version_id: Strict<Uuid>,
4116        }
4117        let wire = __Wire::deserialize(deserializer)?;
4118        Ok(Self {
4119            source_field_id: wire.source_field_id.0,
4120            source_resource_id: wire.source_resource_id.0,
4121            source_version_id: wire.source_version_id.0,
4122            vector_index_id: wire.vector_index_id.0,
4123            version_id: wire.version_id.0,
4124        })
4125    }
4126}
4127
4128/// Distances use float64 source values. Smaller distances rank first. Dot distance is the negative
4129/// inner product.
4130#[derive(Clone, Debug, PartialEq, Eq)]
4131pub enum VectorMetric {
4132    /// A known contract value.
4133    Cosine,
4134    /// A known contract value.
4135    Euclidean,
4136    /// A known contract value.
4137    Dot,
4138    /// A value introduced by a newer server.
4139    Unknown(String),
4140}
4141impl Serialize for VectorMetric {
4142    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4143        serializer.serialize_str(match self {
4144            Self::Cosine => "cosine",
4145            Self::Euclidean => "euclidean",
4146            Self::Dot => "dot",
4147            Self::Unknown(value) => value,
4148        })
4149    }
4150}
4151impl<'de> Deserialize<'de> for VectorMetric {
4152    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4153        Ok(match String::deserialize(deserializer)?.as_str() {
4154            "cosine" => Self::Cosine,
4155            "euclidean" => Self::Euclidean,
4156            "dot" => Self::Dot,
4157            value => Self::Unknown(value.to_owned()),
4158        })
4159    }
4160}
4161impl<'de> DeserializeStrict<'de> for VectorMetric {
4162    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4163        #[derive(Deserialize)]
4164        enum __Known {
4165            #[serde(rename = "cosine")]
4166            Cosine,
4167            #[serde(rename = "euclidean")]
4168            Euclidean,
4169            #[serde(rename = "dot")]
4170            Dot,
4171        }
4172        Ok(match __Known::deserialize(deserializer)? {
4173            __Known::Cosine => Self::Cosine,
4174            __Known::Euclidean => Self::Euclidean,
4175            __Known::Dot => Self::Dot,
4176        })
4177    }
4178}
4179
4180/// The Arrow schema stores this value as JSON under `scandal.vector_search`. Exhaustive means that
4181/// all indexed rows fit within the selected partition and candidate limits. A smaller result
4182/// exhausts this fixed budget. It does not prove exhaustion of the complete filtered population
4183/// unless exhaustive is true. Every result has `scandal.row_id`, `scandal.distance`, and one-based
4184/// `scandal.rank` columns. Requested source fields follow these columns. Their names must not
4185/// collide with these reserved names.
4186#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
4187pub struct VectorSearchInfo {
4188    /// Contract field exhaustive.
4189    #[serde(rename = "exhaustive")]
4190    pub exhaustive: bool,
4191    /// Contract field indexedRows.
4192    #[serde(rename = "indexedRows")]
4193    pub indexed_rows: SafeUnsignedLong,
4194    /// Contract field limit.
4195    #[serde(rename = "limit")]
4196    pub limit: u32,
4197    /// Contract field metric.
4198    #[serde(rename = "metric")]
4199    pub metric: VectorMetric,
4200    /// Contract field origin.
4201    #[serde(rename = "origin")]
4202    pub origin: VectorIndexOrigin,
4203    /// Contract field probes.
4204    #[serde(rename = "probes")]
4205    pub probes: u32,
4206    /// Contract field rerank.
4207    #[serde(rename = "rerank")]
4208    pub rerank: u32,
4209}
4210impl<'de> DeserializeStrict<'de> for VectorSearchInfo {
4211    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4212        #[derive(Deserialize)]
4213        #[serde(deny_unknown_fields)]
4214        struct __Wire {
4215            #[serde(rename = "exhaustive")]
4216            exhaustive: Strict<bool>,
4217            #[serde(rename = "indexedRows")]
4218            indexed_rows: Strict<SafeUnsignedLong>,
4219            #[serde(rename = "limit")]
4220            limit: Strict<u32>,
4221            #[serde(rename = "metric")]
4222            metric: Strict<VectorMetric>,
4223            #[serde(rename = "origin")]
4224            origin: Strict<VectorIndexOrigin>,
4225            #[serde(rename = "probes")]
4226            probes: Strict<u32>,
4227            #[serde(rename = "rerank")]
4228            rerank: Strict<u32>,
4229        }
4230        let wire = __Wire::deserialize(deserializer)?;
4231        Ok(Self {
4232            exhaustive: wire.exhaustive.0,
4233            indexed_rows: wire.indexed_rows.0,
4234            limit: wire.limit.0,
4235            metric: wire.metric.0,
4236            origin: wire.origin.0,
4237            probes: wire.probes.0,
4238            rerank: wire.rerank.0,
4239        })
4240    }
4241}
4242
4243/// Change the type of the column or field at `path` to `dataType`, converting without loss.
4244#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
4245pub struct WidenType {
4246    /// Contract field dataType.
4247    #[serde(rename = "dataType")]
4248    pub data_type: ArrowDataType,
4249    /// Contract field path.
4250    #[serde(rename = "path")]
4251    pub path: Vec<String>,
4252}
4253impl<'de> DeserializeStrict<'de> for WidenType {
4254    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4255        #[derive(Deserialize)]
4256        #[serde(deny_unknown_fields)]
4257        struct __Wire {
4258            #[serde(rename = "dataType")]
4259            data_type: Strict<ArrowDataType>,
4260            #[serde(rename = "path")]
4261            path: Strict<Vec<String>>,
4262        }
4263        let wire = __Wire::deserialize(deserializer)?;
4264        Ok(Self {
4265            data_type: wire.data_type.0,
4266            path: wire.path.0,
4267        })
4268    }
4269}
4270
4271/// Row windows that a scan visited or ruled out by statistics.
4272#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
4273pub struct WindowCounters {
4274    /// Contract field prunedStatistics.
4275    #[serde(rename = "prunedStatistics")]
4276    pub pruned_statistics: SafeUnsignedLong,
4277    /// Contract field visited.
4278    #[serde(rename = "visited")]
4279    pub visited: SafeUnsignedLong,
4280}
4281impl<'de> DeserializeStrict<'de> for WindowCounters {
4282    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4283        #[derive(Deserialize)]
4284        #[serde(deny_unknown_fields)]
4285        struct __Wire {
4286            #[serde(rename = "prunedStatistics")]
4287            pruned_statistics: Strict<SafeUnsignedLong>,
4288            #[serde(rename = "visited")]
4289            visited: Strict<SafeUnsignedLong>,
4290        }
4291        let wire = __Wire::deserialize(deserializer)?;
4292        Ok(Self {
4293            pruned_statistics: wire.pruned_statistics.0,
4294            visited: wire.visited.0,
4295        })
4296    }
4297}
4298
4299/// The mirror of file `fragmentId` of `source`, a version of another Table: a file of `table` with
4300/// the source file's ID, row count and row IDs, so a scan of `source` can read it at its own
4301/// positions. The Arrow rows have the Table's schema and are the rows `source` keeps in that file,
4302/// in stored order: the service checks their count, places them at the kept positions, and writes
4303/// nulls at the positions `source` deletes. `base` is the version the mirror is for, absent for the
4304/// Table's first. Files go under `attempt`'s directory.
4305#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
4306pub struct WriteAlignedRequest {
4307    /// Contract field attempt.
4308    #[serde(rename = "attempt")]
4309    #[serde(default, skip_serializing_if = "Option::is_none")]
4310    pub attempt: Option<Uuid>,
4311    /// Contract field base.
4312    #[serde(rename = "base")]
4313    #[serde(default, skip_serializing_if = "Option::is_none")]
4314    pub base: Option<Uuid>,
4315    /// Contract field fragmentId.
4316    #[serde(rename = "fragmentId")]
4317    pub fragment_id: Uuid,
4318    /// Contract field source.
4319    #[serde(rename = "source")]
4320    pub source: TableVersion,
4321    /// Contract field sourceStorage.
4322    #[serde(rename = "sourceStorage")]
4323    #[serde(default, skip_serializing_if = "Option::is_none")]
4324    pub source_storage: Option<StorageBinding>,
4325    /// Contract field table.
4326    #[serde(rename = "table")]
4327    pub table: TableBinding,
4328}
4329impl<'de> DeserializeStrict<'de> for WriteAlignedRequest {
4330    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4331        #[derive(Deserialize)]
4332        #[serde(deny_unknown_fields)]
4333        struct __Wire {
4334            #[serde(rename = "attempt")]
4335            #[serde(default)]
4336            attempt: Strict<Option<Uuid>>,
4337            #[serde(rename = "base")]
4338            #[serde(default)]
4339            base: Strict<Option<Uuid>>,
4340            #[serde(rename = "fragmentId")]
4341            fragment_id: Strict<Uuid>,
4342            #[serde(rename = "source")]
4343            source: Strict<TableVersion>,
4344            #[serde(rename = "sourceStorage")]
4345            #[serde(default)]
4346            source_storage: Strict<Option<StorageBinding>>,
4347            #[serde(rename = "table")]
4348            table: Strict<TableBinding>,
4349        }
4350        let wire = __Wire::deserialize(deserializer)?;
4351        Ok(Self {
4352            attempt: wire.attempt.0,
4353            base: wire.base.0,
4354            fragment_id: wire.fragment_id.0,
4355            source: wire.source.0,
4356            source_storage: wire.source_storage.0,
4357            table: wire.table.0,
4358        })
4359    }
4360}
4361
4362/// What a prepared version builds on: the Table's first version, an append that keeps the base
4363/// version's rows, an overwrite that replaces them, a delete of selected rows, an edit that takes
4364/// appended rows, patches, deleted rows, column files and a schema change, or a version whose files
4365/// mirror the files of a version of another Table.
4366#[derive(Clone, Debug, PartialEq, Eq)]
4367pub enum WriteBase {
4368    /// A known union arm.
4369    Aligned(AlignedBase),
4370    /// A known union arm.
4371    Append(SuccessorBase),
4372    /// A known union arm.
4373    Delete(Box<DeleteBase>),
4374    /// A known union arm.
4375    Edit(EditBase),
4376    /// A known union arm.
4377    Genesis(GenesisBase),
4378    /// A known union arm.
4379    Overwrite(SuccessorBase),
4380    /// An unknown discriminator and its complete wire object.
4381    Unknown { tag: String, value: Value },
4382}
4383impl Serialize for WriteBase {
4384    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
4385        match self {
4386            Self::Aligned(value) => {
4387                let mut object = serde_json::Map::new();
4388                object.insert("type".into(), Value::String("aligned".into()));
4389                object.insert(
4390                    "aligned".into(),
4391                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
4392                );
4393                Value::Object(object).serialize(serializer)
4394            }
4395            Self::Append(value) => {
4396                let mut object = serde_json::Map::new();
4397                object.insert("type".into(), Value::String("append".into()));
4398                object.insert(
4399                    "append".into(),
4400                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
4401                );
4402                Value::Object(object).serialize(serializer)
4403            }
4404            Self::Delete(value) => {
4405                let mut object = serde_json::Map::new();
4406                object.insert("type".into(), Value::String("delete".into()));
4407                object.insert(
4408                    "delete".into(),
4409                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
4410                );
4411                Value::Object(object).serialize(serializer)
4412            }
4413            Self::Edit(value) => {
4414                let mut object = serde_json::Map::new();
4415                object.insert("type".into(), Value::String("edit".into()));
4416                object.insert(
4417                    "edit".into(),
4418                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
4419                );
4420                Value::Object(object).serialize(serializer)
4421            }
4422            Self::Genesis(value) => {
4423                let mut object = serde_json::Map::new();
4424                object.insert("type".into(), Value::String("genesis".into()));
4425                object.insert(
4426                    "genesis".into(),
4427                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
4428                );
4429                Value::Object(object).serialize(serializer)
4430            }
4431            Self::Overwrite(value) => {
4432                let mut object = serde_json::Map::new();
4433                object.insert("type".into(), Value::String("overwrite".into()));
4434                object.insert(
4435                    "overwrite".into(),
4436                    serde_json::to_value(value).map_err(serde::ser::Error::custom)?,
4437                );
4438                Value::Object(object).serialize(serializer)
4439            }
4440            Self::Unknown { tag, value } => {
4441                if value.get("type").and_then(Value::as_str) != Some(tag.as_str()) {
4442                    return Err(serde::ser::Error::custom(
4443                        "unknown union discriminator mismatch",
4444                    ));
4445                }
4446                value.serialize(serializer)
4447            }
4448        }
4449    }
4450}
4451impl<'de> Deserialize<'de> for WriteBase {
4452    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4453        let value = Value::deserialize(deserializer)?;
4454        let tag = value
4455            .get("type")
4456            .and_then(Value::as_str)
4457            .ok_or_else(|| serde::de::Error::custom("union requires type"))?;
4458        match tag {
4459            "aligned" => Ok(Self::Aligned(
4460                serde_json::from_value(
4461                    value
4462                        .get("aligned")
4463                        .cloned()
4464                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
4465                )
4466                .map_err(serde::de::Error::custom)?,
4467            )),
4468            "append" => Ok(Self::Append(
4469                serde_json::from_value(
4470                    value
4471                        .get("append")
4472                        .cloned()
4473                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
4474                )
4475                .map_err(serde::de::Error::custom)?,
4476            )),
4477            "delete" => Ok(Self::Delete(
4478                serde_json::from_value(
4479                    value
4480                        .get("delete")
4481                        .cloned()
4482                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
4483                )
4484                .map_err(serde::de::Error::custom)?,
4485            )),
4486            "edit" => Ok(Self::Edit(
4487                serde_json::from_value(
4488                    value
4489                        .get("edit")
4490                        .cloned()
4491                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
4492                )
4493                .map_err(serde::de::Error::custom)?,
4494            )),
4495            "genesis" => Ok(Self::Genesis(
4496                serde_json::from_value(
4497                    value
4498                        .get("genesis")
4499                        .cloned()
4500                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
4501                )
4502                .map_err(serde::de::Error::custom)?,
4503            )),
4504            "overwrite" => Ok(Self::Overwrite(
4505                serde_json::from_value(
4506                    value
4507                        .get("overwrite")
4508                        .cloned()
4509                        .ok_or_else(|| serde::de::Error::custom("union requires matching arm"))?,
4510                )
4511                .map_err(serde::de::Error::custom)?,
4512            )),
4513            tag => Ok(Self::Unknown {
4514                tag: tag.to_owned(),
4515                value,
4516            }),
4517        }
4518    }
4519}
4520impl<'de> DeserializeStrict<'de> for WriteBase {
4521    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4522        #[derive(Deserialize)]
4523        enum __Tag0 {
4524            #[serde(rename = "aligned")]
4525            Value,
4526        }
4527        #[derive(Deserialize)]
4528        #[serde(deny_unknown_fields)]
4529        struct __Arm0 {
4530            #[serde(rename = "type")]
4531            _tag: __Tag0,
4532            #[serde(rename = "aligned")]
4533            value: Strict<AlignedBase>,
4534        }
4535        #[derive(Deserialize)]
4536        enum __Tag1 {
4537            #[serde(rename = "append")]
4538            Value,
4539        }
4540        #[derive(Deserialize)]
4541        #[serde(deny_unknown_fields)]
4542        struct __Arm1 {
4543            #[serde(rename = "type")]
4544            _tag: __Tag1,
4545            #[serde(rename = "append")]
4546            value: Strict<SuccessorBase>,
4547        }
4548        #[derive(Deserialize)]
4549        enum __Tag2 {
4550            #[serde(rename = "delete")]
4551            Value,
4552        }
4553        #[derive(Deserialize)]
4554        #[serde(deny_unknown_fields)]
4555        struct __Arm2 {
4556            #[serde(rename = "type")]
4557            _tag: __Tag2,
4558            #[serde(rename = "delete")]
4559            value: Strict<DeleteBase>,
4560        }
4561        #[derive(Deserialize)]
4562        enum __Tag3 {
4563            #[serde(rename = "edit")]
4564            Value,
4565        }
4566        #[derive(Deserialize)]
4567        #[serde(deny_unknown_fields)]
4568        struct __Arm3 {
4569            #[serde(rename = "type")]
4570            _tag: __Tag3,
4571            #[serde(rename = "edit")]
4572            value: Strict<EditBase>,
4573        }
4574        #[derive(Deserialize)]
4575        enum __Tag4 {
4576            #[serde(rename = "genesis")]
4577            Value,
4578        }
4579        #[derive(Deserialize)]
4580        #[serde(deny_unknown_fields)]
4581        struct __Arm4 {
4582            #[serde(rename = "type")]
4583            _tag: __Tag4,
4584            #[serde(rename = "genesis")]
4585            value: Strict<GenesisBase>,
4586        }
4587        #[derive(Deserialize)]
4588        enum __Tag5 {
4589            #[serde(rename = "overwrite")]
4590            Value,
4591        }
4592        #[derive(Deserialize)]
4593        #[serde(deny_unknown_fields)]
4594        struct __Arm5 {
4595            #[serde(rename = "type")]
4596            _tag: __Tag5,
4597            #[serde(rename = "overwrite")]
4598            value: Strict<SuccessorBase>,
4599        }
4600        #[derive(Deserialize)]
4601        #[serde(untagged)]
4602        enum __Known {
4603            Aligned(Box<__Arm0>),
4604            Append(Box<__Arm1>),
4605            Delete(Box<__Arm2>),
4606            Edit(Box<__Arm3>),
4607            Genesis(Box<__Arm4>),
4608            Overwrite(Box<__Arm5>),
4609        }
4610        Ok(match __Known::deserialize(deserializer)? {
4611            __Known::Aligned(arm) => Self::Aligned(arm.value.0),
4612            __Known::Append(arm) => Self::Append(arm.value.0),
4613            __Known::Delete(arm) => Self::Delete(Box::new(arm.value.0)),
4614            __Known::Edit(arm) => Self::Edit(arm.value.0),
4615            __Known::Genesis(arm) => Self::Genesis(arm.value.0),
4616            __Known::Overwrite(arm) => Self::Overwrite(arm.value.0),
4617        })
4618    }
4619}
4620
4621/// WriteBlobRequest contract value.
4622#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
4623pub struct WriteBlobRequest {
4624    /// Contract field maxBytes.
4625    #[serde(rename = "maxBytes")]
4626    pub max_bytes: SafeUnsignedLong,
4627    /// Contract field mediaType.
4628    #[serde(rename = "mediaType")]
4629    pub media_type: String,
4630    /// Contract field table.
4631    #[serde(rename = "table")]
4632    pub table: TableBinding,
4633}
4634impl<'de> DeserializeStrict<'de> for WriteBlobRequest {
4635    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4636        #[derive(Deserialize)]
4637        #[serde(deny_unknown_fields)]
4638        struct __Wire {
4639            #[serde(rename = "maxBytes")]
4640            max_bytes: Strict<SafeUnsignedLong>,
4641            #[serde(rename = "mediaType")]
4642            media_type: Strict<String>,
4643            #[serde(rename = "table")]
4644            table: Strict<TableBinding>,
4645        }
4646        let wire = __Wire::deserialize(deserializer)?;
4647        Ok(Self {
4648            max_bytes: wire.max_bytes.0,
4649            media_type: wire.media_type.0,
4650            table: wire.table.0,
4651        })
4652    }
4653}
4654
4655/// Preferred storage partitioning and clustering for new fragments of an exact table.
4656#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
4657pub struct WriteLayout {
4658    /// Contract field ordering.
4659    #[serde(rename = "ordering")]
4660    pub ordering: Vec<SortColumn>,
4661    /// Contract field partitioning.
4662    #[serde(rename = "partitioning")]
4663    pub partitioning: Vec<PartitionColumn>,
4664}
4665impl<'de> DeserializeStrict<'de> for WriteLayout {
4666    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4667        #[derive(Deserialize)]
4668        #[serde(deny_unknown_fields)]
4669        struct __Wire {
4670            #[serde(rename = "ordering")]
4671            ordering: Strict<Vec<SortColumn>>,
4672            #[serde(rename = "partitioning")]
4673            partitioning: Strict<Vec<PartitionColumn>>,
4674        }
4675        let wire = __Wire::deserialize(deserializer)?;
4676        Ok(Self {
4677            ordering: wire.ordering.0,
4678            partitioning: wire.partitioning.0,
4679        })
4680    }
4681}
4682
4683/// Guaranteed ordering of one input stream. Each stream is an independent ordered run; this does
4684/// not assert ordering between streams or fragments. Writers validate the order before certifying
4685/// fragments. An empty order makes no ordering claim.
4686#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
4687pub struct WriteProperties {
4688    /// Contract field ordering.
4689    #[serde(rename = "ordering")]
4690    pub ordering: Vec<SortColumn>,
4691}
4692impl<'de> DeserializeStrict<'de> for WriteProperties {
4693    fn deserialize_strict<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
4694        #[derive(Deserialize)]
4695        #[serde(deny_unknown_fields)]
4696        struct __Wire {
4697            #[serde(rename = "ordering")]
4698            ordering: Strict<Vec<SortColumn>>,
4699        }
4700        let wire = __Wire::deserialize(deserializer)?;
4701        Ok(Self {
4702            ordering: wire.ordering.0,
4703        })
4704    }
4705}
4706
4707/// Typed errors declared by this service contract.
4708#[derive(Clone, Debug, PartialEq, Eq)]
4709pub enum ScandalError {
4710    /// Scandal:BudgetExceeded.
4711    BudgetExceeded { message: String },
4712    /// Scandal:Conflict.
4713    Conflict { message: String },
4714    /// Scandal:Internal.
4715    Internal { message: String },
4716    /// Scandal:InvalidArgument.
4717    InvalidArgument { message: String },
4718    /// Scandal:NotFound.
4719    NotFound { resource: String },
4720    /// Scandal:PermissionDenied.
4721    PermissionDenied { operation: String, resource: String },
4722    /// Scandal:StorageUnavailable.
4723    StorageUnavailable { message: String },
4724    /// Scandal:Unauthenticated.
4725    Unauthenticated { message: String },
4726    /// Scandal:Unavailable.
4727    Unavailable { message: String },
4728}
4729impl ScandalError {
4730    /// HTTP status for this declared error.
4731    pub fn status(&self) -> u16 {
4732        match self {
4733            Self::BudgetExceeded { .. } => 400,
4734            Self::Conflict { .. } => 409,
4735            Self::Internal { .. } => 500,
4736            Self::InvalidArgument { .. } => 400,
4737            Self::NotFound { .. } => 404,
4738            Self::PermissionDenied { .. } => 403,
4739            Self::StorageUnavailable { .. } => 500,
4740            Self::Unauthenticated { .. } => 401,
4741            Self::Unavailable { .. } => 503,
4742        }
4743    }
4744    /// Serialize only contract-declared error parameters.
4745    pub fn envelope(&self, instance: String) -> ErrorEnvelope {
4746        match self {
4747            Self::BudgetExceeded { message } => {
4748                let mut envelope =
4749                    ErrorEnvelope::new("INVALID_ARGUMENT", "Scandal:BudgetExceeded", instance);
4750                envelope
4751                    .parameters
4752                    .insert("message".into(), message.to_string());
4753                envelope
4754            }
4755            Self::Conflict { message } => {
4756                let mut envelope = ErrorEnvelope::new("CONFLICT", "Scandal:Conflict", instance);
4757                envelope
4758                    .parameters
4759                    .insert("message".into(), message.to_string());
4760                envelope
4761            }
4762            Self::Internal { message } => {
4763                let mut envelope = ErrorEnvelope::new("INTERNAL", "Scandal:Internal", instance);
4764                envelope
4765                    .parameters
4766                    .insert("message".into(), message.to_string());
4767                envelope
4768            }
4769            Self::InvalidArgument { message } => {
4770                let mut envelope =
4771                    ErrorEnvelope::new("INVALID_ARGUMENT", "Scandal:InvalidArgument", instance);
4772                envelope
4773                    .parameters
4774                    .insert("message".into(), message.to_string());
4775                envelope
4776            }
4777            Self::NotFound { resource } => {
4778                let mut envelope = ErrorEnvelope::new("NOT_FOUND", "Scandal:NotFound", instance);
4779                envelope
4780                    .parameters
4781                    .insert("resource".into(), resource.to_string());
4782                envelope
4783            }
4784            Self::PermissionDenied {
4785                operation,
4786                resource,
4787            } => {
4788                let mut envelope =
4789                    ErrorEnvelope::new("PERMISSION_DENIED", "Scandal:PermissionDenied", instance);
4790                envelope
4791                    .parameters
4792                    .insert("operation".into(), operation.to_string());
4793                envelope
4794                    .parameters
4795                    .insert("resource".into(), resource.to_string());
4796                envelope
4797            }
4798            Self::StorageUnavailable { message } => {
4799                let mut envelope =
4800                    ErrorEnvelope::new("INTERNAL", "Scandal:StorageUnavailable", instance);
4801                envelope
4802                    .parameters
4803                    .insert("message".into(), message.to_string());
4804                envelope
4805            }
4806            Self::Unauthenticated { message } => {
4807                let mut envelope =
4808                    ErrorEnvelope::new("UNAUTHENTICATED", "Scandal:Unauthenticated", instance);
4809                envelope
4810                    .parameters
4811                    .insert("message".into(), message.to_string());
4812                envelope
4813            }
4814            Self::Unavailable { message } => {
4815                let mut envelope =
4816                    ErrorEnvelope::new("UNAVAILABLE", "Scandal:Unavailable", instance);
4817                envelope
4818                    .parameters
4819                    .insert("message".into(), message.to_string());
4820                envelope
4821            }
4822        }
4823    }
4824    /// Decode a declared error and its typed error parameters.
4825    pub fn decode_envelope(envelope: &ErrorEnvelope) -> Option<Self> {
4826        if envelope.error_instance_id.len() != 36
4827            || Uuid::parse_str(&envelope.error_instance_id).is_err()
4828        {
4829            return None;
4830        }
4831        match envelope.error_name.as_str() {
4832            "Scandal:BudgetExceeded" => {
4833                if envelope.error_code != "INVALID_ARGUMENT" {
4834                    return None;
4835                }
4836                let message = envelope.parameters.get("message")?.clone();
4837                Some(Self::BudgetExceeded { message })
4838            }
4839            "Scandal:Conflict" => {
4840                if envelope.error_code != "CONFLICT" {
4841                    return None;
4842                }
4843                let message = envelope.parameters.get("message")?.clone();
4844                Some(Self::Conflict { message })
4845            }
4846            "Scandal:Internal" => {
4847                if envelope.error_code != "INTERNAL" {
4848                    return None;
4849                }
4850                let message = envelope.parameters.get("message")?.clone();
4851                Some(Self::Internal { message })
4852            }
4853            "Scandal:InvalidArgument" => {
4854                if envelope.error_code != "INVALID_ARGUMENT" {
4855                    return None;
4856                }
4857                let message = envelope.parameters.get("message")?.clone();
4858                Some(Self::InvalidArgument { message })
4859            }
4860            "Scandal:NotFound" => {
4861                if envelope.error_code != "NOT_FOUND" {
4862                    return None;
4863                }
4864                let resource = envelope.parameters.get("resource")?.clone();
4865                Some(Self::NotFound { resource })
4866            }
4867            "Scandal:PermissionDenied" => {
4868                if envelope.error_code != "PERMISSION_DENIED" {
4869                    return None;
4870                }
4871                let operation = envelope.parameters.get("operation")?.clone();
4872                let resource = envelope.parameters.get("resource")?.clone();
4873                Some(Self::PermissionDenied {
4874                    operation,
4875                    resource,
4876                })
4877            }
4878            "Scandal:StorageUnavailable" => {
4879                if envelope.error_code != "INTERNAL" {
4880                    return None;
4881                }
4882                let message = envelope.parameters.get("message")?.clone();
4883                Some(Self::StorageUnavailable { message })
4884            }
4885            "Scandal:Unauthenticated" => {
4886                if envelope.error_code != "UNAUTHENTICATED" {
4887                    return None;
4888                }
4889                let message = envelope.parameters.get("message")?.clone();
4890                Some(Self::Unauthenticated { message })
4891            }
4892            "Scandal:Unavailable" => {
4893                if envelope.error_code != "UNAVAILABLE" {
4894                    return None;
4895                }
4896                let message = envelope.parameters.get("message")?.clone();
4897                Some(Self::Unavailable { message })
4898            }
4899            _ => None,
4900        }
4901    }
4902}
4903impl Display for ScandalError {
4904    fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
4905        match self {
4906            Self::BudgetExceeded { message } => {
4907                write!(formatter, "Scandal:BudgetExceeded (message: {})", message)
4908            }
4909            Self::Conflict { message } => {
4910                write!(formatter, "Scandal:Conflict (message: {})", message)
4911            }
4912            Self::Internal { message } => {
4913                write!(formatter, "Scandal:Internal (message: {})", message)
4914            }
4915            Self::InvalidArgument { message } => {
4916                write!(formatter, "Scandal:InvalidArgument (message: {})", message)
4917            }
4918            Self::NotFound { resource } => {
4919                write!(formatter, "Scandal:NotFound (resource: {})", resource)
4920            }
4921            Self::PermissionDenied {
4922                operation,
4923                resource,
4924            } => write!(
4925                formatter,
4926                "Scandal:PermissionDenied (operation: {}, resource: {})",
4927                operation, resource
4928            ),
4929            Self::StorageUnavailable { message } => write!(
4930                formatter,
4931                "Scandal:StorageUnavailable (message: {})",
4932                message
4933            ),
4934            Self::Unauthenticated { message } => {
4935                write!(formatter, "Scandal:Unauthenticated (message: {})", message)
4936            }
4937            Self::Unavailable { message } => {
4938                write!(formatter, "Scandal:Unavailable (message: {})", message)
4939            }
4940        }
4941    }
4942}
4943impl StdError for ScandalError {}
4944impl ServiceError for ScandalError {
4945    fn to_envelope(&self, instance: String) -> ErrorEnvelope {
4946        Self::envelope(self, instance)
4947    }
4948    fn from_envelope(envelope: &ErrorEnvelope) -> Option<Self> {
4949        Self::decode_envelope(envelope)
4950    }
4951}