Skip to main content

nominal_api/proto/
nominal.procedures.v1.rs

1// This file is @generated by prost-build.
2/// ProcedureState is the versioned state of a procedure template.
3#[derive(Clone, PartialEq, ::prost::Message)]
4pub struct ProcedureState {
5    /// TODO(niwong): global_fields is deprecated, remove in a future version.
6    #[prost(map = "string, message", tag = "1")]
7    pub global_fields: ::std::collections::HashMap<
8        ::prost::alloc::string::String,
9        FormField,
10    >,
11    /// Global fields are set at the beginning of the procedure execution.
12    /// These fields can be referenced by any step in the procedure by using {field_id}.
13    #[prost(message, repeated, tag = "5")]
14    pub new_global_fields: ::prost::alloc::vec::Vec<FormField>,
15    /// A map from node ID to the node.
16    #[prost(map = "string, message", tag = "2")]
17    pub nodes: ::std::collections::HashMap<
18        ::prost::alloc::string::String,
19        ProcedureNode,
20    >,
21    /// Section edges represent the visual grouping of sections and steps.
22    /// All keys are IDs for section nodes, and all values are lists of IDs for section or step nodes.
23    /// { A, \[B, C\] } means that section A visually groups nodes B and C together.
24    #[prost(map = "string, message", tag = "3")]
25    pub section_edges: ::std::collections::HashMap<
26        ::prost::alloc::string::String,
27        NodeList,
28    >,
29    /// Step edges represent the dependencies between steps.
30    /// All keys and values are IDs for step nodes.
31    /// { A, \[B, C\] } means that steps B and C depend on step A to complete to be started
32    #[prost(map = "string, message", tag = "4")]
33    pub step_edges: ::std::collections::HashMap<
34        ::prost::alloc::string::String,
35        NodeList,
36    >,
37}
38/// A simpler representation of the procedure graph that is used for display in a UI.
39#[derive(Clone, PartialEq, ::prost::Message)]
40pub struct ProcedureDisplayGraph {
41    /// Sections or steps that do not belong to any parent sections.
42    /// This is ordered in a topological ordering of steps.
43    #[prost(string, repeated, tag = "1")]
44    pub top_level_nodes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
45    /// Map of section node IDs to their topologically sorted children
46    #[prost(map = "string, message", tag = "2")]
47    pub section_to_sorted_children: ::std::collections::HashMap<
48        ::prost::alloc::string::String,
49        NodeList,
50    >,
51}
52/// A simplified version of procedure state that is currently used for procedure authoring.
53/// In this form, the graph is a completely linear structure where each step depends solely
54/// on the preceding step.
55#[derive(Clone, PartialEq, ::prost::Message)]
56pub struct NestedProcedure {
57    /// Title of the procedure
58    #[prost(string, tag = "1")]
59    pub title: ::prost::alloc::string::String,
60    /// Optional long-form description for the procedure
61    #[prost(string, optional, tag = "2")]
62    pub description: ::core::option::Option<::prost::alloc::string::String>,
63    /// Steps in the procedure
64    #[prost(message, repeated, tag = "3")]
65    pub steps: ::prost::alloc::vec::Vec<NestedProcedureNode>,
66    /// TODO(niwong): global_fields is deprecated, remove in a future version.
67    #[prost(map = "string, message", tag = "4")]
68    pub global_fields: ::std::collections::HashMap<
69        ::prost::alloc::string::String,
70        FormField,
71    >,
72    /// Global fields are set at the beginning of the procedure execution.
73    /// These fields can be referenced by any step in the procedure by using {field_id}.
74    #[prost(message, repeated, tag = "5")]
75    pub new_global_fields: ::prost::alloc::vec::Vec<FormField>,
76}
77/// A list of node IDs.
78#[derive(Clone, PartialEq, ::prost::Message)]
79pub struct NodeList {
80    #[prost(string, repeated, tag = "1")]
81    pub node_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
82}
83/// A procedure node is either a section or a step.
84#[derive(Clone, PartialEq, ::prost::Message)]
85pub struct ProcedureNode {
86    #[prost(oneof = "procedure_node::Node", tags = "1, 2")]
87    pub node: ::core::option::Option<procedure_node::Node>,
88}
89/// Nested message and enum types in `ProcedureNode`.
90pub mod procedure_node {
91    #[derive(Clone, PartialEq, ::prost::Oneof)]
92    pub enum Node {
93        /// A section node provides a visual grouping of other sections and steps.
94        #[prost(message, tag = "1")]
95        Section(super::ProcedureSectionNode),
96        /// A step node represents a step in the procedure.
97        /// It serves as a "template" for the ExecutionStep that will be created during procedure execution.
98        #[prost(message, tag = "2")]
99        Step(super::ProcedureStepNode),
100    }
101}
102/// A procedure section node visually groups other sections and steps.
103#[derive(Clone, PartialEq, ::prost::Message)]
104pub struct ProcedureSectionNode {
105    /// Unique identifier for this node in the procedure graph.
106    #[prost(string, tag = "1")]
107    pub id: ::prost::alloc::string::String,
108    /// Title of this section
109    #[prost(string, tag = "2")]
110    pub title: ::prost::alloc::string::String,
111    /// Optional long-form description for this section
112    #[prost(string, optional, tag = "3")]
113    pub description: ::core::option::Option<::prost::alloc::string::String>,
114}
115/// A procedure step node represents a step in the procedure.
116#[derive(Clone, PartialEq, ::prost::Message)]
117pub struct ProcedureStepNode {
118    /// Unique identifier for this node in the procedure graph.
119    #[prost(string, tag = "1")]
120    pub id: ::prost::alloc::string::String,
121    /// Title of this step
122    #[prost(string, tag = "2")]
123    pub title: ::prost::alloc::string::String,
124    /// The content of this step.
125    #[prost(message, optional, tag = "3")]
126    pub content: ::core::option::Option<ProcedureStepContent>,
127    /// Optional long-form description for this step
128    #[prost(string, optional, tag = "5")]
129    pub description: ::core::option::Option<::prost::alloc::string::String>,
130    /// is_required defaults to false, meaning that the step may be skipped
131    #[prost(bool, optional, tag = "6")]
132    pub is_required: ::core::option::Option<bool>,
133    /// Configuration for if and how the step should automatically transition from NOT_STARTED to IN_PROGRESS
134    /// By default, this will be `all_parents`.
135    #[prost(message, optional, tag = "7")]
136    pub auto_start: ::core::option::Option<AutoStartConfig>,
137    /// Configuration for if and how the step should automatically submit the step contents when requirements are met.
138    /// By default, this will be `disabled`.
139    #[prost(message, optional, tag = "8")]
140    pub initial_auto_proceed_config: ::core::option::Option<AutoProceedConfig>,
141    /// Configuration for whether the step will require a condition to be met for the step to be completed
142    /// By default, this is not set, meaning that the step will not wait on any conditions before completing.
143    #[prost(message, optional, tag = "9")]
144    pub success_condition: ::core::option::Option<SuccessCondition>,
145    /// Configuration for the actions to take when the step transitions to a completed state (SUCCEEDED, ERRORED, SKIPPED)
146    /// By default, there are no actions.
147    #[prost(message, repeated, tag = "10")]
148    pub completion_action_configs: ::prost::alloc::vec::Vec<CompletionActionConfig>,
149    /// Optional attachments for the step description
150    #[prost(string, repeated, tag = "11")]
151    pub attachments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
152}
153/// A section or a step in a NestedProcedure.
154#[derive(Clone, PartialEq, ::prost::Message)]
155pub struct NestedProcedureNode {
156    /// The unique identifier for this step or section
157    #[prost(string, tag = "5")]
158    pub id: ::prost::alloc::string::String,
159    /// Title of this section or step.
160    #[prost(string, tag = "1")]
161    pub title: ::prost::alloc::string::String,
162    /// Optional long-form description for this section or step.
163    #[prost(string, optional, tag = "2")]
164    pub description: ::core::option::Option<::prost::alloc::string::String>,
165    /// If this node is a section, then it can contain other sections and steps.
166    #[prost(message, repeated, tag = "3")]
167    pub steps: ::prost::alloc::vec::Vec<NestedProcedureNode>,
168    /// If this node is a step, then this field contains the step definition.
169    #[prost(message, optional, tag = "4")]
170    pub step: ::core::option::Option<nested_procedure_node::NestedStepNode>,
171}
172/// Nested message and enum types in `NestedProcedureNode`.
173pub mod nested_procedure_node {
174    /// These fields' docs are identical to those of ProcedureStepNode.
175    #[derive(Clone, PartialEq, ::prost::Message)]
176    pub struct NestedStepNode {
177        #[prost(bool, optional, tag = "2")]
178        pub is_required: ::core::option::Option<bool>,
179        #[prost(message, optional, tag = "3")]
180        pub auto_start: ::core::option::Option<super::AutoStartConfig>,
181        #[prost(message, optional, tag = "4")]
182        pub initial_auto_proceed_config: ::core::option::Option<
183            super::AutoProceedConfig,
184        >,
185        #[prost(message, optional, tag = "5")]
186        pub success_condition: ::core::option::Option<super::SuccessCondition>,
187        #[prost(message, repeated, tag = "6")]
188        pub completion_action_configs: ::prost::alloc::vec::Vec<
189            super::CompletionActionConfig,
190        >,
191        /// Optional attachments for the step description
192        #[prost(string, repeated, tag = "51")]
193        pub attachments: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
194        /// This should be kept in sync with ProcedureStepContent.content
195        #[prost(oneof = "nested_step_node::Content", tags = "7, 8, 9, 10")]
196        pub content: ::core::option::Option<nested_step_node::Content>,
197    }
198    /// Nested message and enum types in `NestedStepNode`.
199    pub mod nested_step_node {
200        /// This should be kept in sync with ProcedureStepContent.content
201        #[derive(Clone, PartialEq, ::prost::Oneof)]
202        pub enum Content {
203            #[prost(message, tag = "7")]
204            Form(super::super::FormStep),
205            #[prost(message, tag = "8")]
206            StartIngest(super::super::StartIngestStep),
207            #[prost(message, tag = "9")]
208            SelectOrCreateAsset(super::super::SelectOrCreateAssetStep),
209            #[prost(message, tag = "10")]
210            Wait(super::super::WaitStep),
211        }
212    }
213}
214/// AutoStartConfig is a configuration that determines whether a step should be
215/// automatically moved from NOT_STARTED to IN_PROGRESS when some set of criteria are met.
216/// By default this will be `all_parents`
217#[derive(Clone, Copy, PartialEq, ::prost::Message)]
218pub struct AutoStartConfig {
219    #[prost(oneof = "auto_start_config::Config", tags = "1, 2")]
220    pub config: ::core::option::Option<auto_start_config::Config>,
221}
222/// Nested message and enum types in `AutoStartConfig`.
223pub mod auto_start_config {
224    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
225    pub struct AllParents {}
226    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
227    pub struct Disabled {}
228    #[derive(Clone, Copy, PartialEq, ::prost::Oneof)]
229    pub enum Config {
230        /// The step will start automatically when all parent steps have passed.
231        #[prost(message, tag = "1")]
232        AllParents(AllParents),
233        /// The step will not start automatically.
234        #[prost(message, tag = "2")]
235        Disabled(Disabled),
236    }
237}
238/// AutoProceedConfig is a configuration that determines whether a step should
239/// automatically proceed (submit the contents and check success_conditions)
240/// when some set of criteria are met. By default this will be `disabled`.
241#[derive(Clone, Copy, PartialEq, ::prost::Message)]
242pub struct AutoProceedConfig {
243    #[prost(oneof = "auto_proceed_config::Config", tags = "1, 2")]
244    pub config: ::core::option::Option<auto_proceed_config::Config>,
245}
246/// Nested message and enum types in `AutoProceedConfig`.
247pub mod auto_proceed_config {
248    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
249    pub struct Disabled {}
250    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
251    pub struct Enabled {}
252    #[derive(Clone, Copy, PartialEq, ::prost::Oneof)]
253    pub enum Config {
254        /// The step will not be automatically completed
255        #[prost(message, tag = "1")]
256        Disabled(Disabled),
257        /// The step will automatically submit the step contents once the requirements are met and
258        /// begin the transition to either PASSED or ERRORED.
259        #[prost(message, tag = "2")]
260        Enabled(Enabled),
261    }
262}
263/// The condition that must be met for a step to succeed after submitting its contents.
264#[derive(Clone, PartialEq, ::prost::Message)]
265pub struct SuccessCondition {
266    #[prost(oneof = "success_condition::Condition", tags = "1, 2, 3, 4, 5")]
267    pub condition: ::core::option::Option<success_condition::Condition>,
268}
269/// Nested message and enum types in `SuccessCondition`.
270pub mod success_condition {
271    #[derive(Clone, PartialEq, ::prost::Oneof)]
272    pub enum Condition {
273        #[prost(message, tag = "1")]
274        And(super::AndSuccessCondition),
275        #[prost(message, tag = "2")]
276        Timer(super::TimerSuccessCondition),
277        #[prost(message, tag = "3")]
278        IngestJob(super::IngestJobSuccessCondition),
279        #[prost(message, tag = "4")]
280        ChannelValidation(super::ChannelValidationSuccessCondition),
281        /// OrSuccessCondition or = 6;
282        #[prost(message, tag = "5")]
283        Webhook(super::WebhookSuccessCondition),
284    }
285}
286/// All conditions within must be met for the step to be succeeded.
287#[derive(Clone, PartialEq, ::prost::Message)]
288pub struct AndSuccessCondition {
289    #[prost(message, repeated, tag = "1")]
290    pub conditions: ::prost::alloc::vec::Vec<SuccessCondition>,
291}
292/// A timer condition that will succeed the step after a specified duration.
293#[derive(Clone, Copy, PartialEq, ::prost::Message)]
294pub struct TimerSuccessCondition {
295    /// Duration in seconds to wait before succeeding the step. This value must be non-negative.
296    /// This duration is a minimum bound; the actual duration may be longer.
297    #[prost(int32, tag = "1")]
298    pub duration_seconds: i32,
299}
300/// The step will succeed when the associated ingest job succeeds.
301/// If the ingest job fails, the step will move to ERRORED.
302#[derive(Clone, PartialEq, ::prost::Message)]
303pub struct IngestJobSuccessCondition {
304    /// The field ID that contains the IngestJobRid of the ingest job to monitor.
305    #[prost(string, tag = "1")]
306    pub field_id: ::prost::alloc::string::String,
307}
308/// Defines a success condition that compares channel data against a threshold value.
309/// The step succeeds when the comparison (channel_value COMPARATOR threshold) evaluates to true
310/// within the timeout period. For example, checking if a channel value is greater than 100.
311#[derive(Clone, PartialEq, ::prost::Message)]
312pub struct ChannelValidationSuccessCondition {
313    /// The channel to validate against the threshold.
314    #[prost(message, optional, tag = "1")]
315    pub channel: ::core::option::Option<
316        channel_validation_success_condition::ChannelLocator,
317    >,
318    /// The comparison operator to use.
319    /// COMPARATOR_UNSPECIFIED should never be used and will be rejected at runtime.
320    #[prost(enumeration = "channel_validation_success_condition::Comparator", tag = "2")]
321    pub comparator: i32,
322    /// The threshold value to compare the channel data against.
323    /// The comparison is: channel_value COMPARATOR threshold
324    /// Using double for better precision. Note: When using COMPARATOR_EQUAL or COMPARATOR_NOT_EQUAL
325    /// with floating-point channel data, be aware of potential precision issues inherent to IEEE 754.
326    #[prost(double, tag = "3")]
327    pub threshold: f64,
328    /// Maximum time in milliseconds to wait for the condition to be satisfied.
329    /// If the timeout expires before the comparison evaluates to true, the step moves to ERRORED.
330    /// Must be greater than zero and at most one hour (3,600,000 milliseconds).
331    #[prost(int32, tag = "4")]
332    pub timeout_millis: i32,
333    /// optionally specify a persistence of individual points
334    #[prost(uint32, optional, tag = "5")]
335    pub point_persistence: ::core::option::Option<u32>,
336    /// optionally specify a persistence duration in milliseconds (max 5 minutes) for which the condition must hold true
337    #[prost(uint32, optional, tag = "6")]
338    pub time_persistence: ::core::option::Option<u32>,
339}
340/// Nested message and enum types in `ChannelValidationSuccessCondition`.
341pub mod channel_validation_success_condition {
342    /// Locates a specific channel within a data source for validation.
343    /// Uses symbolic reference names that are resolved to concrete resources at execution time,
344    /// allowing procedure templates to be defined before the actual data sources exist.
345    /// If the data_source_ref or channel_name cannot be resolved at execution time, the step will
346    /// transition to ERRORED state immediately.
347    #[derive(Clone, PartialEq, ::prost::Message)]
348    pub struct ChannelLocator {
349        /// Symbolic name for the data source (e.g., "main", "test_data").
350        /// This name is resolved to a concrete DataSourceRid at execution time by looking up the name
351        /// in the data scopes (for assets) or data sources (for runs) specified by asset_or_run.
352        /// This is NOT a field reference - it's a literal string that must match a data source ref name.
353        /// Maps to Java type: io.nominal.scout.api.DataSourceRefName
354        #[prost(string, tag = "1")]
355        pub data_source_ref: ::prost::alloc::string::String,
356        /// The name of the channel within the data source to validate.
357        /// Maps to Java type: io.nominal.api.Channel
358        #[prost(string, tag = "2")]
359        pub channel_name: ::prost::alloc::string::String,
360        /// Optional series tags to filter the channel data.
361        /// Used to select specific series when multiple series exist for the same channel name.
362        /// Maps to Java types: io.nominal.api.TagName (key), io.nominal.api.TagValue (value)
363        #[prost(map = "string, string", tag = "3")]
364        pub tags: ::std::collections::HashMap<
365            ::prost::alloc::string::String,
366            ::prost::alloc::string::String,
367        >,
368        /// Specifies the context for evaluating the channel data.
369        /// Must specify exactly one of: asset reference (for asset-scoped data) or run reference (for run-scoped data).
370        #[prost(oneof = "channel_locator::AssetOrRun", tags = "4, 5")]
371        pub asset_or_run: ::core::option::Option<channel_locator::AssetOrRun>,
372    }
373    /// Nested message and enum types in `ChannelLocator`.
374    pub mod channel_locator {
375        /// Specifies the context for evaluating the channel data.
376        /// Must specify exactly one of: asset reference (for asset-scoped data) or run reference (for run-scoped data).
377        #[derive(Clone, PartialEq, ::prost::Oneof)]
378        pub enum AssetOrRun {
379            #[prost(message, tag = "4")]
380            Asset(super::super::AssetReference),
381            #[prost(message, tag = "5")]
382            Run(super::super::RunReference),
383        }
384    }
385    /// Comparison operator to evaluate channel value against threshold.
386    /// The condition is satisfied when: channel_value COMPARATOR threshold
387    /// Example: COMPARATOR_GREATER_THAN with threshold 100.0 means channel_value > 100.0
388    ///
389    /// Evaluation semantics: The most recent channel value within the timeout period is used for comparison.
390    /// If the channel has no data, the condition will continuously retry until timeout_millis expires.
391    #[derive(
392        Clone,
393        Copy,
394        Debug,
395        PartialEq,
396        Eq,
397        Hash,
398        PartialOrd,
399        Ord,
400        ::prost::Enumeration
401    )]
402    #[repr(i32)]
403    pub enum Comparator {
404        /// Unspecified comparator. This is an invalid state and should never be used.
405        /// Required by proto3 convention as the zero value. Will be rejected at runtime.
406        Unspecified = 0,
407        GreaterThan = 1,
408        GreaterThanOrEqual = 2,
409        LessThan = 3,
410        LessThanOrEqual = 4,
411        Equal = 5,
412        NotEqual = 6,
413    }
414    impl Comparator {
415        /// String value of the enum field names used in the ProtoBuf definition.
416        ///
417        /// The values are not transformed in any way and thus are considered stable
418        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
419        pub fn as_str_name(&self) -> &'static str {
420            match self {
421                Self::Unspecified => "COMPARATOR_UNSPECIFIED",
422                Self::GreaterThan => "COMPARATOR_GREATER_THAN",
423                Self::GreaterThanOrEqual => "COMPARATOR_GREATER_THAN_OR_EQUAL",
424                Self::LessThan => "COMPARATOR_LESS_THAN",
425                Self::LessThanOrEqual => "COMPARATOR_LESS_THAN_OR_EQUAL",
426                Self::Equal => "COMPARATOR_EQUAL",
427                Self::NotEqual => "COMPARATOR_NOT_EQUAL",
428            }
429        }
430        /// Creates an enum from field names used in the ProtoBuf definition.
431        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
432            match value {
433                "COMPARATOR_UNSPECIFIED" => Some(Self::Unspecified),
434                "COMPARATOR_GREATER_THAN" => Some(Self::GreaterThan),
435                "COMPARATOR_GREATER_THAN_OR_EQUAL" => Some(Self::GreaterThanOrEqual),
436                "COMPARATOR_LESS_THAN" => Some(Self::LessThan),
437                "COMPARATOR_LESS_THAN_OR_EQUAL" => Some(Self::LessThanOrEqual),
438                "COMPARATOR_EQUAL" => Some(Self::Equal),
439                "COMPARATOR_NOT_EQUAL" => Some(Self::NotEqual),
440                _ => None,
441            }
442        }
443    }
444}
445/// A webhook success condition that waits for external system approval via HTTP webhook.
446/// The step succeeds when the external system responds with 2xx status code.
447///
448/// Failure behavior:
449/// - 4xx responses: Permanent failure, no retry (CLIENT_ERROR)
450/// - 5xx responses: Retry with exponential backoff until max_retries (SERVER_ERROR_MAX_RETRIES_EXCEEDED)
451/// - Network errors: Retry until max_retries (NETWORK_ERROR_MAX_RETRIES_EXCEEDED)
452/// - Timeout: Retry until timeout_seconds exceeded (OVERALL_TIMEOUT_EXCEEDED)
453/// - Redirects: Followed automatically, fails if redirect loop detected (REDIRECT_LOOP)
454#[derive(Clone, PartialEq, ::prost::Message)]
455pub struct WebhookSuccessCondition {
456    /// RID reference to a WebhookIntegration (the advanced integration type with HMAC signing)
457    #[prost(string, tag = "1")]
458    pub integration_rid: ::prost::alloc::string::String,
459    /// Webhook delivery configuration. If not provided, server uses documented defaults.
460    #[prost(message, optional, tag = "2")]
461    pub delivery_config: ::core::option::Option<WebhookDeliveryConfig>,
462    /// Event type to send (e.g., "procedure.step_waiting")
463    #[prost(string, tag = "3")]
464    pub event_type: ::prost::alloc::string::String,
465    /// JSON payload template using Handlebars syntax (<https://handlebarsjs.com/>)
466    /// Supports variable references using {{variable_name}} syntax:
467    /// - {{execution_rid}} - Procedure execution RID
468    /// - {{step_id}} - Current step ID
469    /// - {{step_name}} - Current step name/title
470    /// - {{procedure_name}} - Procedure name
471    /// - {{field_id}} - Any global form field value (e.g., {{environment}}, {{approval_level}})
472    /// - {{asset_rid}} - Asset RID if step has asset context
473    /// - {{asset_name}} - Asset name if step has asset context
474    ///
475    /// Advanced features:
476    /// - Conditionals: {{#if environment}}production mode{{/if}}
477    /// - Loops: {{#each tags}}{{this}}{{/each}}
478    /// - Comparisons: {{#if (eq priority "HIGH")}}urgent{{/if}}
479    /// - Default values: {{default environment "unknown"}}
480    ///
481    /// Example template:
482    /// {
483    ///    "event": "approval_required",
484    ///    "execution_id": "{{execution_rid}}",
485    ///    "step": "{{step_name}}",
486    ///    "environment": "{{environment}}",
487    ///    {{#if asset_name}}
488    ///    "asset": "{{asset_name}}",
489    ///    {{/if}}
490    ///    "is_production": {{#if (eq environment "production")}}true{{else}}false{{/if}}
491    /// }
492    ///
493    /// Variables that cannot be resolved will be replaced with empty string.
494    /// Invalid JSON after template evaluation will cause the condition to fail with PAYLOAD_ERROR reason.
495    #[prost(string, tag = "4")]
496    pub payload_template: ::prost::alloc::string::String,
497}
498/// Configuration for webhook delivery retry logic and timeouts.
499#[derive(Clone, Copy, PartialEq, ::prost::Message)]
500pub struct WebhookDeliveryConfig {
501    /// Maximum delivery attempts (default: 3, max: 10)
502    #[prost(int32, optional, tag = "1")]
503    pub max_retries: ::core::option::Option<i32>,
504    /// Initial retry interval seconds (default: 15, min: 5, max: 300)
505    #[prost(int64, optional, tag = "2")]
506    pub retry_interval_seconds: ::core::option::Option<i64>,
507    /// Use exponential backoff (default: true)
508    #[prost(bool, optional, tag = "3")]
509    pub exponential_backoff: ::core::option::Option<bool>,
510    /// Max retry interval seconds (default: 300, max: 3600)
511    #[prost(int64, optional, tag = "4")]
512    pub max_retry_interval_seconds: ::core::option::Option<i64>,
513    /// Overall timeout seconds (default: 600, max: 86400)
514    #[prost(int64, optional, tag = "5")]
515    pub timeout_seconds: ::core::option::Option<i64>,
516}
517/// An action that will be taken when a step transitions to a completed state
518/// (succeeded, errored, or skipped). These actions are executed after the step
519/// contents are submitted and the PassCondition (if any) is satisfied. These
520/// actions are executed synchronously with the state transition and generally
521/// should be quick to complete.
522/// Almost all actions will be executed only if the step transitions to SUCCEEDED.
523/// The exception is CreateEvent, which will be executed for all terminal states.
524#[derive(Clone, PartialEq, ::prost::Message)]
525pub struct CompletionActionConfig {
526    #[prost(oneof = "completion_action_config::Config", tags = "1, 2, 3, 4, 5, 6")]
527    pub config: ::core::option::Option<completion_action_config::Config>,
528}
529/// Nested message and enum types in `CompletionActionConfig`.
530pub mod completion_action_config {
531    #[derive(Clone, PartialEq, ::prost::Oneof)]
532    pub enum Config {
533        #[prost(message, tag = "1")]
534        CreateEvent(super::CreateEventConfig),
535        #[prost(message, tag = "2")]
536        SendNotification(super::SendNotificationConfig),
537        #[prost(message, tag = "3")]
538        CreateRun(super::CreateRunConfig),
539        #[prost(message, tag = "4")]
540        ApplyWorkbookTemplates(super::ApplyWorkbookTemplatesConfig),
541        #[prost(message, tag = "5")]
542        ApplyChecklists(super::ApplyChecklistsConfig),
543        /// ...
544        #[prost(message, tag = "6")]
545        UpdateRun(super::UpdateRunConfig),
546    }
547}
548/// An action to create an event when a step is completed.
549/// The completion state of the step is mapped to the event's EventType as follows:
550/// - SUCCEEDED -> SUCCESS
551/// - ERRORED -> ERROR
552/// - SKIPPED -> INFO
553#[derive(Clone, PartialEq, ::prost::Message)]
554pub struct CreateEventConfig {
555    #[prost(string, tag = "1")]
556    pub name: ::prost::alloc::string::String,
557    #[prost(string, optional, tag = "2")]
558    pub description: ::core::option::Option<::prost::alloc::string::String>,
559    #[prost(string, repeated, tag = "3")]
560    pub labels: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
561    /// Deprecated in favor of property_refs
562    /// Properties will be overridden by any property_refs with the same key.
563    #[prost(map = "string, string", tag = "4")]
564    pub properties: ::std::collections::HashMap<
565        ::prost::alloc::string::String,
566        ::prost::alloc::string::String,
567    >,
568    /// Each asset_field_id will be resolved and added as an AssetRid to the created event
569    /// deprecated in favor of asset_references
570    #[prost(string, repeated, tag = "5")]
571    pub asset_field_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
572    /// The assets to associate the event with. There must be at least one.
573    /// asset_references takes precedence over (deprecated) asset_field_ids if both are set.
574    ///
575    /// TODO(niwong): re-add after client updates \[(buf.validate.field).repeated.min_items = 1\];
576    #[prost(message, repeated, tag = "6")]
577    pub asset_references: ::prost::alloc::vec::Vec<AssetReference>,
578    /// Properties to apply to the event
579    #[prost(message, repeated, tag = "7")]
580    pub property_refs: ::prost::alloc::vec::Vec<PropertyReference>,
581}
582/// An action to send a notification to one or more integrations when a step is completed.
583#[derive(Clone, PartialEq, ::prost::Message)]
584pub struct SendNotificationConfig {
585    /// The integration(s) to use to send the notification.
586    #[prost(message, optional, tag = "1")]
587    pub integrations: ::core::option::Option<MultiIntegrationReference>,
588    /// The optional title of the notification (length constrained to 130 chars by the IntegrationService).
589    #[prost(message, optional, tag = "2")]
590    pub title: ::core::option::Option<StringReference>,
591    /// The message body of the notification.
592    ///
593    /// We are omitting some optional parameters to the IntegrationService#sendMessage endpoint,
594    /// such as tags, priority, and opsGenieAlias. For all current integration types as of 2025-09-15
595    /// (besides OpsGenie), only title and message are used.
596    #[prost(message, optional, tag = "3")]
597    pub message: ::core::option::Option<StringReference>,
598}
599/// An action to create a run when a step is completed.
600#[derive(Clone, PartialEq, ::prost::Message)]
601pub struct CreateRunConfig {
602    /// If present, the run RID for this step will be available in outputs under this field ID.
603    #[prost(string, optional, tag = "1")]
604    pub run_output_field_id: ::core::option::Option<::prost::alloc::string::String>,
605    /// The assets to associate the run with. There must be at least one.
606    #[prost(message, optional, tag = "2")]
607    pub assets: ::core::option::Option<MultiAssetReference>,
608    /// The name of the run.
609    #[prost(message, optional, tag = "3")]
610    pub name: ::core::option::Option<StringReference>,
611    /// Optionally, a description for the run.
612    #[prost(message, optional, tag = "4")]
613    pub description: ::core::option::Option<StringReference>,
614    /// The time range for the run. If unset, the run will be created starting at now() with no end time.
615    #[prost(message, optional, tag = "5")]
616    pub time_range: ::core::option::Option<TimeRangeReference>,
617    /// Labels to apply on the run.
618    #[prost(message, optional, tag = "6")]
619    pub labels: ::core::option::Option<MultiStringReference>,
620    /// Properties to apply on the run.
621    ///
622    /// repeated UrlReference links;
623    /// repeated AttachmentRidReference attachments; // requires some sort of AttachmentRidField where FE handles upload
624    #[prost(message, repeated, tag = "7")]
625    pub properties: ::prost::alloc::vec::Vec<create_run_config::Property>,
626}
627/// Nested message and enum types in `CreateRunConfig`.
628pub mod create_run_config {
629    #[derive(Clone, PartialEq, ::prost::Message)]
630    pub struct Property {
631        #[prost(message, optional, tag = "1")]
632        pub key: ::core::option::Option<super::StringReference>,
633        #[prost(message, optional, tag = "2")]
634        pub value: ::core::option::Option<super::StringReference>,
635    }
636}
637/// An action to update an existing run when a step is completed (e.g. set end time to previous step end time).
638///
639/// option (buf.validate.message).cel = {
640///    id: "update_run_config.at_least_one_update"
641///    message: "At least one update field (name, description, time_range, labels, or properties) must be set"
642///    expression: "has(this.name) || has(this.description) || has(this.time_range) || has(this.labels) || this.properties.size() > 0"
643/// };
644#[derive(Clone, PartialEq, ::prost::Message)]
645pub struct UpdateRunConfig {
646    /// The run(s) to update. Typically but not limited to a reference to a run created earlier in the procedure
647    #[prost(message, optional, tag = "1")]
648    pub runs: ::core::option::Option<MultiRunReference>,
649    /// Optional PATCH-style updates. Only set fields that should change.
650    /// If unset, the run will not be updated.
651    #[prost(message, optional, tag = "2")]
652    pub name: ::core::option::Option<StringReference>,
653    #[prost(message, optional, tag = "3")]
654    pub description: ::core::option::Option<StringReference>,
655    #[prost(message, optional, tag = "4")]
656    pub time_range: ::core::option::Option<TimeRangeReference>,
657    /// TODO(ryanyost): support patch-behavior for labels
658    #[prost(message, optional, tag = "5")]
659    pub labels: ::core::option::Option<MultiStringReference>,
660    /// TODO(ryanyost): support patch-behavior for properties
661    #[prost(message, repeated, tag = "6")]
662    pub properties: ::prost::alloc::vec::Vec<PropertyReference>,
663    /// When true, time fields overwrite existing values. When false, start only moves earlier, end only moves later (aligns with runs API strictOverwrite).
664    #[prost(bool, optional, tag = "7")]
665    pub strict_overwrite: ::core::option::Option<bool>,
666}
667#[derive(Clone, PartialEq, ::prost::Message)]
668pub struct PropertyReference {
669    #[prost(message, optional, tag = "1")]
670    pub key: ::core::option::Option<StringReference>,
671    #[prost(message, optional, tag = "2")]
672    pub value: ::core::option::Option<StringReference>,
673}
674/// An action to apply one or more workbook templates to one or more runs when a step is completed.
675#[derive(Clone, PartialEq, ::prost::Message)]
676pub struct ApplyWorkbookTemplatesConfig {
677    /// The workbook templates to apply.
678    #[prost(message, optional, tag = "1")]
679    pub workbook_templates: ::core::option::Option<MultiWorkbookTemplateReference>,
680    /// The runs to apply the workbook templates to. There must be at least one.
681    #[prost(message, optional, tag = "2")]
682    pub runs: ::core::option::Option<MultiRunReference>,
683}
684/// An action to apply one or more checklists to one or more runs when a step is completed.
685#[derive(Clone, PartialEq, ::prost::Message)]
686pub struct ApplyChecklistsConfig {
687    /// The checklists to apply.
688    #[prost(message, optional, tag = "1")]
689    pub checklists: ::core::option::Option<MultiChecklistReference>,
690    /// The runs to apply the checklists to. There must be at least one.
691    #[prost(message, optional, tag = "2")]
692    pub runs: ::core::option::Option<MultiRunReference>,
693}
694/// The content of a procedure step. This typically involves some form of user interaction/input.
695#[derive(Clone, PartialEq, ::prost::Message)]
696pub struct ProcedureStepContent {
697    /// This should be kept in sync with NestedProcedureNode.NestedStepNode.content
698    #[prost(oneof = "procedure_step_content::Content", tags = "1, 2, 3, 4")]
699    pub content: ::core::option::Option<procedure_step_content::Content>,
700}
701/// Nested message and enum types in `ProcedureStepContent`.
702pub mod procedure_step_content {
703    /// This should be kept in sync with NestedProcedureNode.NestedStepNode.content
704    #[derive(Clone, PartialEq, ::prost::Oneof)]
705    pub enum Content {
706        #[prost(message, tag = "1")]
707        Form(super::FormStep),
708        #[prost(message, tag = "2")]
709        StartIngest(super::StartIngestStep),
710        #[prost(message, tag = "3")]
711        SelectOrCreateAsset(super::SelectOrCreateAssetStep),
712        /// ...
713        #[prost(message, tag = "4")]
714        Wait(super::WaitStep),
715    }
716}
717#[derive(Clone, Copy, PartialEq, ::prost::Message)]
718pub struct WaitStep {}
719/// A form step consists of a set of fields to be filled out by the user.
720#[derive(Clone, PartialEq, ::prost::Message)]
721pub struct FormStep {
722    #[prost(message, repeated, tag = "1")]
723    pub fields: ::prost::alloc::vec::Vec<FormField>,
724}
725/// The user will be prompted to start an ingest job in the frontend
726/// and the output of the step will be the rid of the created ingest job.
727#[derive(Clone, PartialEq, ::prost::Message)]
728pub struct StartIngestStep {
729    /// The asset to ingest data into.
730    #[prost(message, optional, tag = "1")]
731    pub asset: ::core::option::Option<AssetReference>,
732    /// The data scope within the asset to ingest data into.
733    #[prost(message, optional, tag = "2")]
734    pub ref_name: ::core::option::Option<StringReference>,
735    /// Restrict and pre-configure the type of ingest that can be started.
736    #[prost(message, optional, tag = "3")]
737    pub ingest_type_config: ::core::option::Option<start_ingest_step::IngestTypeConfig>,
738    /// If present, the ingest job RID for this step will be available in outputs under this field ID.
739    #[prost(string, optional, tag = "4")]
740    pub ingest_job_output_field_id: ::core::option::Option<
741        ::prost::alloc::string::String,
742    >,
743}
744/// Nested message and enum types in `StartIngestStep`.
745pub mod start_ingest_step {
746    #[derive(Clone, PartialEq, ::prost::Message)]
747    pub struct IngestTypeConfig {
748        #[prost(oneof = "ingest_type_config::Config", tags = "1, 2, 3, 4")]
749        pub config: ::core::option::Option<ingest_type_config::Config>,
750    }
751    /// Nested message and enum types in `IngestTypeConfig`.
752    pub mod ingest_type_config {
753        #[derive(Clone, PartialEq, ::prost::Message)]
754        pub struct ContainerizedExtractorIngestConfig {
755            /// The ingest job must use this specific containerized extractor.
756            #[prost(string, tag = "1")]
757            pub rid: ::prost::alloc::string::String,
758            /// The step will prompt the user to upload a file for each extractor input that doesn't have a FileInputBinding.
759            #[prost(message, repeated, tag = "2")]
760            pub file_input_bindings: ::prost::alloc::vec::Vec<
761                super::super::FileInputBinding,
762            >,
763        }
764        #[derive(Clone, PartialEq, ::prost::Message)]
765        pub struct DataflashIngestConfig {
766            /// File to ingest into the dataset. Should be a dataflash `.bin` file.
767            /// Uses tags configured on the asset data scope as additional file tags
768            #[prost(message, optional, tag = "1")]
769            pub file_input: ::core::option::Option<super::super::FileReference>,
770        }
771        #[derive(Clone, PartialEq, ::prost::Message)]
772        pub struct CsvIngestConfig {
773            /// header for timestamp column
774            #[prost(message, optional, tag = "1")]
775            pub timestamp_series_name: ::core::option::Option<
776                super::super::StringReference,
777            >,
778            #[prost(message, optional, tag = "2")]
779            pub timestamp_type: ::core::option::Option<
780                super::super::TimestampTypeParameter,
781            >,
782            /// File to ingest into the dataset. Should be a `.csv` or `.csv.gz` file.
783            /// Uses tags configured on the asset data scope as additional file tags
784            #[prost(message, optional, tag = "3")]
785            pub file_input: ::core::option::Option<super::super::FileReference>,
786        }
787        #[derive(Clone, PartialEq, ::prost::Message)]
788        pub struct ParquetIngestConfig {
789            /// header for timestamp column
790            #[prost(message, optional, tag = "1")]
791            pub timestamp_series_name: ::core::option::Option<
792                super::super::StringReference,
793            >,
794            #[prost(message, optional, tag = "2")]
795            pub timestamp_type: ::core::option::Option<
796                super::super::TimestampTypeParameter,
797            >,
798            /// File to ingest into the dataset. Should be a `.parquet` or `.parquet.gz` file or archive file.
799            /// Uses tags configured on the asset data scope as additional file tags
800            #[prost(message, optional, tag = "3")]
801            pub file_input: ::core::option::Option<super::super::FileReference>,
802        }
803        #[derive(Clone, PartialEq, ::prost::Oneof)]
804        pub enum Config {
805            /// The ingest job must be a containerized extractor ingest.
806            #[prost(message, tag = "1")]
807            ContainerizedExtractor(ContainerizedExtractorIngestConfig),
808            #[prost(message, tag = "2")]
809            Dataflash(DataflashIngestConfig),
810            #[prost(message, tag = "3")]
811            Csv(CsvIngestConfig),
812            #[prost(message, tag = "4")]
813            Parquet(ParquetIngestConfig),
814        }
815    }
816}
817#[derive(Clone, PartialEq, ::prost::Message)]
818pub struct FileInputBinding {
819    /// The input key. For containerized extractors, this is the environment variable name.
820    #[prost(string, tag = "1")]
821    pub environment_variable: ::prost::alloc::string::String,
822    /// The specific type of file
823    #[prost(message, optional, tag = "2")]
824    pub file_reference: ::core::option::Option<FileReference>,
825}
826#[derive(Clone, PartialEq, ::prost::Message)]
827pub struct FileReference {
828    #[prost(oneof = "file_reference::Option", tags = "1")]
829    pub option: ::core::option::Option<file_reference::Option>,
830}
831/// Nested message and enum types in `FileReference`.
832pub mod file_reference {
833    #[derive(Clone, PartialEq, ::prost::Oneof)]
834    pub enum Option {
835        /// Reference a field from a prior step
836        #[prost(string, tag = "1")]
837        FieldId(::prost::alloc::string::String),
838    }
839}
840#[derive(Clone, PartialEq, ::prost::Message)]
841pub struct TimestampTypeParameter {
842    #[prost(oneof = "timestamp_type_parameter::Option", tags = "1, 2")]
843    pub option: ::core::option::Option<timestamp_type_parameter::Option>,
844}
845/// Nested message and enum types in `TimestampTypeParameter`.
846pub mod timestamp_type_parameter {
847    /// Can allow for more configuration
848    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
849    pub struct UserInputOptions {}
850    #[derive(Clone, PartialEq, ::prost::Oneof)]
851    pub enum Option {
852        /// Timestamp type to always use for ingest.
853        #[prost(message, tag = "1")]
854        Constant(super::TimestampType),
855        /// If specified, allows user to enter timestamp metadata based on input options.
856        #[prost(message, tag = "2")]
857        UserInput(UserInputOptions),
858    }
859}
860#[derive(Clone, PartialEq, ::prost::Message)]
861pub struct TimestampType {
862    #[prost(oneof = "timestamp_type::Option", tags = "1, 2")]
863    pub option: ::core::option::Option<timestamp_type::Option>,
864}
865/// Nested message and enum types in `TimestampType`.
866pub mod timestamp_type {
867    #[derive(Clone, PartialEq, ::prost::Oneof)]
868    pub enum Option {
869        #[prost(message, tag = "1")]
870        Relative(super::RelativeTimestamp),
871        #[prost(message, tag = "2")]
872        Absolute(super::AbsoluteTimestamp),
873    }
874}
875#[derive(Clone, PartialEq, ::prost::Message)]
876pub struct RelativeTimestamp {
877    #[prost(string, tag = "1")]
878    pub time_unit: ::prost::alloc::string::String,
879    /// Starting timestamp to use when indexing the file.
880    #[prost(message, optional, tag = "2")]
881    pub offset: ::core::option::Option<super::super::super::google::protobuf::Timestamp>,
882}
883#[derive(Clone, PartialEq, ::prost::Message)]
884pub struct AbsoluteTimestamp {
885    #[prost(oneof = "absolute_timestamp::Option", tags = "1, 2, 3")]
886    pub option: ::core::option::Option<absolute_timestamp::Option>,
887}
888/// Nested message and enum types in `AbsoluteTimestamp`.
889pub mod absolute_timestamp {
890    #[derive(Clone, PartialEq, ::prost::Oneof)]
891    pub enum Option {
892        #[prost(message, tag = "1")]
893        Iso8601(super::Iso8601Timestamp),
894        #[prost(message, tag = "2")]
895        EpochOfTimeUnit(super::EpochTimestamp),
896        #[prost(message, tag = "3")]
897        CustomFormat(super::CustomTimestamp),
898    }
899}
900#[derive(Clone, Copy, PartialEq, ::prost::Message)]
901pub struct Iso8601Timestamp {}
902#[derive(Clone, PartialEq, ::prost::Message)]
903pub struct EpochTimestamp {
904    #[prost(string, tag = "1")]
905    pub time_unit: ::prost::alloc::string::String,
906}
907#[derive(Clone, PartialEq, ::prost::Message)]
908pub struct CustomTimestamp {
909    /// The format string should be in the format of the `DateTimeFormatter` class in Java.
910    #[prost(string, tag = "1")]
911    pub format: ::prost::alloc::string::String,
912    /// Default year is accepted as an optional field for cases like IRIG time format.
913    /// Will be overridden by year in time format.
914    #[prost(int32, optional, tag = "2")]
915    pub default_year: ::core::option::Option<i32>,
916    /// Default day of year is accepted as an optional field for cases like IRIG time format.
917    /// Will be overridden by day of year in time format.
918    #[prost(int32, optional, tag = "3")]
919    pub default_day_of_year: ::core::option::Option<i32>,
920}
921/// The user will be prompted to select an existing asset or create a new asset.
922#[derive(Clone, PartialEq, ::prost::Message)]
923pub struct SelectOrCreateAssetStep {
924    /// If present, the AssetRid for this step will be available in outputs under this field ID.
925    #[prost(string, optional, tag = "1")]
926    pub asset_output_field_id: ::core::option::Option<::prost::alloc::string::String>,
927    /// If present, the user will be given the option to create a new asset restricted by these parameters.
928    #[prost(message, optional, tag = "2")]
929    pub create_asset_parameters: ::core::option::Option<
930        select_or_create_asset_step::CreateAssetParameters,
931    >,
932    /// The asset selection options for this step.
933    /// This can be omitted, in which case the asset can be chosen freely from all assets.
934    #[prost(oneof = "select_or_create_asset_step::Options", tags = "3")]
935    pub options: ::core::option::Option<select_or_create_asset_step::Options>,
936}
937/// Nested message and enum types in `SelectOrCreateAssetStep`.
938pub mod select_or_create_asset_step {
939    /// When creating an new asset, the title is always provided by the user and the
940    /// frontend should prompt for it. Other parameters for asset creation can be
941    /// specified here as either user-prompted or preset.
942    #[derive(Clone, PartialEq, ::prost::Message)]
943    pub struct CreateAssetParameters {
944        /// If set, the new asset will be created with this description.
945        #[prost(message, optional, tag = "2")]
946        pub description: ::core::option::Option<
947            create_asset_parameters::DescriptionParameter,
948        >,
949        /// If set, the new asset will be created with these labels.
950        #[prost(message, optional, tag = "3")]
951        pub labels: ::core::option::Option<create_asset_parameters::LabelsParameter>,
952        /// If set, the new asset will be created with these properties.
953        #[prost(message, optional, tag = "4")]
954        pub properties: ::core::option::Option<
955            create_asset_parameters::PropertiesParameter,
956        >,
957        /// Data scopes for the new asset. The keys are the ref names of the data scopes.
958        #[prost(map = "string, message", tag = "5")]
959        pub data_scopes: ::std::collections::HashMap<
960            ::prost::alloc::string::String,
961            create_asset_parameters::DataScopeParameter,
962        >,
963    }
964    /// Nested message and enum types in `CreateAssetParameters`.
965    pub mod create_asset_parameters {
966        #[derive(Clone, PartialEq, ::prost::Message)]
967        pub struct DescriptionParameter {
968            #[prost(oneof = "description_parameter::Option", tags = "1")]
969            pub option: ::core::option::Option<description_parameter::Option>,
970        }
971        /// Nested message and enum types in `DescriptionParameter`.
972        pub mod description_parameter {
973            #[derive(Clone, PartialEq, ::prost::Oneof)]
974            pub enum Option {
975                /// The description is always a constant string.
976                ///
977                /// Can allow for free-form / guardrailed (templated?) user input.
978                #[prost(string, tag = "1")]
979                Constant(::prost::alloc::string::String),
980            }
981        }
982        #[derive(Clone, PartialEq, ::prost::Message)]
983        pub struct LabelsParameter {
984            /// Labels to always apply on the new asset.
985            #[prost(string, repeated, tag = "1")]
986            pub constant: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
987            /// If allowing for user input, the frontend should leverage ResourceMetadataService#listPropertiesAndLabels
988            /// to provide the user with existing labels to choose from.
989            #[prost(message, optional, tag = "2")]
990            pub user_input: ::core::option::Option<labels_parameter::UserInputOptions>,
991        }
992        /// Nested message and enum types in `LabelsParameter`.
993        pub mod labels_parameter {
994            /// Can allow for more configuration - e.g. default set of starting labels? (which can be overrideen)
995            #[derive(Clone, Copy, PartialEq, ::prost::Message)]
996            pub struct UserInputOptions {}
997        }
998        #[derive(Clone, PartialEq, ::prost::Message)]
999        pub struct PropertiesParameter {
1000            /// Properties to always apply on the new asset.
1001            #[prost(map = "string, string", tag = "1")]
1002            pub constant: ::std::collections::HashMap<
1003                ::prost::alloc::string::String,
1004                ::prost::alloc::string::String,
1005            >,
1006            /// If allowing for user input, the frontend should leverage ResourceMetadataService#listPropertiesAndLabels
1007            /// to provide the user with existing property keys/values to choose from.
1008            #[prost(message, optional, tag = "2")]
1009            pub user_input: ::core::option::Option<
1010                properties_parameter::UserInputOptions,
1011            >,
1012        }
1013        /// Nested message and enum types in `PropertiesParameter`.
1014        pub mod properties_parameter {
1015            #[derive(Clone, PartialEq, ::prost::Message)]
1016            pub struct UserInputOptions {
1017                /// Each property key here must have a value provided by the user for asset creation.
1018                #[prost(string, repeated, tag = "1")]
1019                pub required_keys: ::prost::alloc::vec::Vec<
1020                    ::prost::alloc::string::String,
1021                >,
1022                /// Each property key here will be suggested to the user but is not required for asset creation
1023                ///
1024                /// Can allow for more configuration - e.g. required k-v pairs, default k-v pairs?
1025                #[prost(string, repeated, tag = "2")]
1026                pub suggested_keys: ::prost::alloc::vec::Vec<
1027                    ::prost::alloc::string::String,
1028                >,
1029            }
1030        }
1031        #[derive(Clone, PartialEq, ::prost::Message)]
1032        pub struct DataScopeParameter {
1033            #[prost(message, optional, tag = "21")]
1034            pub series_tags: ::core::option::Option<super::super::TagsParameter>,
1035            #[prost(oneof = "data_scope_parameter::DataSource", tags = "1, 2")]
1036            pub data_source: ::core::option::Option<data_scope_parameter::DataSource>,
1037        }
1038        /// Nested message and enum types in `DataScopeParameter`.
1039        pub mod data_scope_parameter {
1040            /// The Dataset will be automatically named "{asset}-{ref_name}".
1041            /// Can later allow for this to be specified.
1042            /// Other CreateDataset options exist but are omitted for now
1043            #[derive(Clone, Copy, PartialEq, ::prost::Message)]
1044            pub struct NewDataset {}
1045            #[derive(Clone, PartialEq, ::prost::Message)]
1046            pub struct ExistingDataset {
1047                /// The dataset options for this field.
1048                /// This can be omitted, in which case the dataset can be chosen freely.
1049                #[prost(oneof = "existing_dataset::Options", tags = "1")]
1050                pub options: ::core::option::Option<existing_dataset::Options>,
1051            }
1052            /// Nested message and enum types in `ExistingDataset`.
1053            pub mod existing_dataset {
1054                /// The dataset options for this field.
1055                /// This can be omitted, in which case the dataset can be chosen freely.
1056                #[derive(Clone, PartialEq, ::prost::Oneof)]
1057                pub enum Options {
1058                    /// The dataset must be chosen from preset options.
1059                    #[prost(message, tag = "1")]
1060                    PresetOptions(super::super::super::super::PresetDatasetFieldOptions),
1061                }
1062            }
1063            #[derive(Clone, PartialEq, ::prost::Oneof)]
1064            pub enum DataSource {
1065                /// Creates a new empty dataset.
1066                #[prost(message, tag = "1")]
1067                NewDataset(NewDataset),
1068                /// Use existing dataset
1069                #[prost(message, tag = "2")]
1070                ExistingDataset(ExistingDataset),
1071            }
1072        }
1073    }
1074    /// The asset selection options for this step.
1075    /// This can be omitted, in which case the asset can be chosen freely from all assets.
1076    #[derive(Clone, PartialEq, ::prost::Oneof)]
1077    pub enum Options {
1078        /// The asset must be chosen from preset options.
1079        ///
1080        /// The asset must be chosen from a saved view.
1081        /// SavedViewRid saved_view = 4;
1082        #[prost(message, tag = "3")]
1083        PresetOptions(super::PresetAssetFieldOptions),
1084    }
1085}
1086/// A limited set of options to choose from, with an optional default option.
1087#[derive(Clone, PartialEq, ::prost::Message)]
1088pub struct PresetDatasetFieldOptions {
1089    /// The list of options to choose from.
1090    #[prost(message, repeated, tag = "1")]
1091    pub options: ::prost::alloc::vec::Vec<DatasetReference>,
1092    /// If set, this option will be selected by default, if it is present in the options.
1093    /// The user can still select a different option.
1094    #[prost(message, optional, tag = "2")]
1095    pub default_option: ::core::option::Option<DatasetReference>,
1096}
1097/// A reference to a single dataset
1098#[derive(Clone, PartialEq, ::prost::Message)]
1099pub struct DatasetReference {
1100    #[prost(oneof = "dataset_reference::Option", tags = "1, 2")]
1101    pub option: ::core::option::Option<dataset_reference::Option>,
1102}
1103/// Nested message and enum types in `DatasetReference`.
1104pub mod dataset_reference {
1105    #[derive(Clone, PartialEq, ::prost::Oneof)]
1106    pub enum Option {
1107        /// a constant DatasetRid
1108        #[prost(string, tag = "1")]
1109        Rid(::prost::alloc::string::String),
1110        /// The field reference that will contain a DatasetRid value. The execution will fail if the field is not set
1111        /// but the value is accessed.
1112        #[prost(string, tag = "2")]
1113        FieldId(::prost::alloc::string::String),
1114    }
1115}
1116#[derive(Clone, PartialEq, ::prost::Message)]
1117pub struct TagsParameter {
1118    /// Tags to always filter to on the dataset or asset data scope.
1119    #[prost(map = "string, string", tag = "1")]
1120    pub constant: ::std::collections::HashMap<
1121        ::prost::alloc::string::String,
1122        ::prost::alloc::string::String,
1123    >,
1124    /// If allowing for user input, the frontend should leverage DataSourceService#getAvailableTagKeys/Values
1125    /// to provide the user with existing series tag keys/values to choose from.
1126    #[prost(message, optional, tag = "2")]
1127    pub user_input: ::core::option::Option<tags_parameter::UserInputOptions>,
1128}
1129/// Nested message and enum types in `TagsParameter`.
1130pub mod tags_parameter {
1131    #[derive(Clone, PartialEq, ::prost::Message)]
1132    pub struct UserInputOptions {
1133        /// Each tag key here must have a value provided by the user
1134        #[prost(string, repeated, tag = "1")]
1135        pub required_keys: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1136        /// Each tag key here will be suggested to the user but is not required
1137        ///
1138        /// Can allow for more configuration - e.g. required k-v pairs, default k-v pairs?
1139        #[prost(string, repeated, tag = "2")]
1140        pub suggested_keys: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1141    }
1142}
1143/// A reference to multiple string values
1144#[derive(Clone, PartialEq, ::prost::Message)]
1145pub struct MultiStringReference {
1146    #[prost(oneof = "multi_string_reference::Option", tags = "1")]
1147    pub option: ::core::option::Option<multi_string_reference::Option>,
1148}
1149/// Nested message and enum types in `MultiStringReference`.
1150pub mod multi_string_reference {
1151    #[derive(Clone, PartialEq, ::prost::Oneof)]
1152    pub enum Option {
1153        /// The value is taken from a field in the current or previous steps.
1154        #[prost(string, tag = "1")]
1155        FieldId(::prost::alloc::string::String),
1156    }
1157}
1158/// A reference to a single string value
1159#[derive(Clone, PartialEq, ::prost::Message)]
1160pub struct StringReference {
1161    #[prost(oneof = "string_reference::Option", tags = "1, 2")]
1162    pub option: ::core::option::Option<string_reference::Option>,
1163}
1164/// Nested message and enum types in `StringReference`.
1165pub mod string_reference {
1166    #[derive(Clone, PartialEq, ::prost::Oneof)]
1167    pub enum Option {
1168        /// The value is a constant string
1169        #[prost(string, tag = "1")]
1170        Constant(::prost::alloc::string::String),
1171        /// The value is taken from a field in the current or previous steps.
1172        ///
1173        /// TODO(WB-1728): support string templating.
1174        /// string template = 3;
1175        #[prost(string, tag = "2")]
1176        FieldId(::prost::alloc::string::String),
1177    }
1178}
1179/// A reference to multiple assets
1180#[derive(Clone, PartialEq, ::prost::Message)]
1181pub struct MultiAssetReference {
1182    #[prost(oneof = "multi_asset_reference::Option", tags = "1")]
1183    pub option: ::core::option::Option<multi_asset_reference::Option>,
1184}
1185/// Nested message and enum types in `MultiAssetReference`.
1186pub mod multi_asset_reference {
1187    #[derive(Clone, PartialEq, ::prost::Message)]
1188    pub struct AssetReferenceList {
1189        #[prost(message, repeated, tag = "1")]
1190        pub references: ::prost::alloc::vec::Vec<super::AssetReference>,
1191    }
1192    #[derive(Clone, PartialEq, ::prost::Oneof)]
1193    pub enum Option {
1194        /// TODO: add support for a field that contains a list of asset RIDs
1195        #[prost(message, tag = "1")]
1196        List(AssetReferenceList),
1197    }
1198}
1199/// A reference to a single asset
1200#[derive(Clone, PartialEq, ::prost::Message)]
1201pub struct AssetReference {
1202    #[prost(oneof = "asset_reference::Option", tags = "1, 2")]
1203    pub option: ::core::option::Option<asset_reference::Option>,
1204}
1205/// Nested message and enum types in `AssetReference`.
1206pub mod asset_reference {
1207    #[derive(Clone, PartialEq, ::prost::Oneof)]
1208    pub enum Option {
1209        /// a constant AssetRid
1210        #[prost(string, tag = "1")]
1211        Rid(::prost::alloc::string::String),
1212        /// The field reference that will contain an AssetRid value. The execution will fail if the field is not set
1213        /// but the value is accessed.
1214        #[prost(string, tag = "2")]
1215        FieldId(::prost::alloc::string::String),
1216    }
1217}
1218/// A reference to a time range
1219#[derive(Clone, PartialEq, ::prost::Message)]
1220pub struct TimeRangeReference {
1221    #[prost(oneof = "time_range_reference::Option", tags = "1, 2")]
1222    pub option: ::core::option::Option<time_range_reference::Option>,
1223}
1224/// Nested message and enum types in `TimeRangeReference`.
1225pub mod time_range_reference {
1226    #[derive(Clone, PartialEq, ::prost::Message)]
1227    pub struct IngestJobList {
1228        /// Field ids that contain IngestJobRids.
1229        #[prost(string, repeated, tag = "1")]
1230        pub field_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1231    }
1232    #[derive(Clone, PartialEq, ::prost::Message)]
1233    pub struct RangeLiteral {
1234        /// If absent, the run's start time will not be set or modified.
1235        /// For CreateRunConfig, a start time is required (see message-level CEL constraint).
1236        #[prost(message, optional, tag = "1")]
1237        pub start: ::core::option::Option<super::TimestampReference>,
1238        #[prost(message, optional, tag = "2")]
1239        pub end: ::core::option::Option<super::TimestampReference>,
1240    }
1241    #[derive(Clone, PartialEq, ::prost::Oneof)]
1242    pub enum Option {
1243        /// The time range is the union of the time ranges ingested by all the specified ingest jobs.
1244        #[prost(message, tag = "1")]
1245        FromIngestJobs(IngestJobList),
1246        #[prost(message, tag = "2")]
1247        Literal(RangeLiteral),
1248    }
1249}
1250#[derive(Clone, PartialEq, ::prost::Message)]
1251pub struct TimestampReference {
1252    #[prost(oneof = "timestamp_reference::Option", tags = "1, 2")]
1253    pub option: ::core::option::Option<timestamp_reference::Option>,
1254}
1255/// Nested message and enum types in `TimestampReference`.
1256pub mod timestamp_reference {
1257    #[derive(Clone, PartialEq, ::prost::Oneof)]
1258    pub enum Option {
1259        /// A field reference that resolves to a timestamp from a step's execution state.
1260        /// Supported field names: started_at, succeeded_at, submitted_at, skipped_at, errored_at.
1261        /// Aliases: start_time (= started_at), end_time (= succeeded_at).
1262        #[prost(string, tag = "1")]
1263        FieldId(::prost::alloc::string::String),
1264        /// A literal/constant timestamp
1265        #[prost(message, tag = "2")]
1266        Constant(super::super::super::super::google::protobuf::Timestamp),
1267    }
1268}
1269/// A reference to multiple runs
1270#[derive(Clone, PartialEq, ::prost::Message)]
1271pub struct MultiRunReference {
1272    #[prost(oneof = "multi_run_reference::Option", tags = "1")]
1273    pub option: ::core::option::Option<multi_run_reference::Option>,
1274}
1275/// Nested message and enum types in `MultiRunReference`.
1276pub mod multi_run_reference {
1277    #[derive(Clone, PartialEq, ::prost::Message)]
1278    pub struct RunReferenceList {
1279        #[prost(message, repeated, tag = "1")]
1280        pub references: ::prost::alloc::vec::Vec<super::RunReference>,
1281    }
1282    #[derive(Clone, PartialEq, ::prost::Oneof)]
1283    pub enum Option {
1284        /// TODO: add support for a field that contains a list of run RIDs
1285        #[prost(message, tag = "1")]
1286        List(RunReferenceList),
1287    }
1288}
1289/// A reference to a single run
1290#[derive(Clone, PartialEq, ::prost::Message)]
1291pub struct RunReference {
1292    #[prost(oneof = "run_reference::Option", tags = "1")]
1293    pub option: ::core::option::Option<run_reference::Option>,
1294}
1295/// Nested message and enum types in `RunReference`.
1296pub mod run_reference {
1297    #[derive(Clone, PartialEq, ::prost::Oneof)]
1298    pub enum Option {
1299        /// The field id that will contain a RunRid value. The execution will fail if the field is not set properly.
1300        #[prost(string, tag = "1")]
1301        FieldId(::prost::alloc::string::String),
1302    }
1303}
1304/// A reference to multiple workbook templates
1305#[derive(Clone, PartialEq, ::prost::Message)]
1306pub struct MultiWorkbookTemplateReference {
1307    #[prost(oneof = "multi_workbook_template_reference::Option", tags = "1")]
1308    pub option: ::core::option::Option<multi_workbook_template_reference::Option>,
1309}
1310/// Nested message and enum types in `MultiWorkbookTemplateReference`.
1311pub mod multi_workbook_template_reference {
1312    #[derive(Clone, PartialEq, ::prost::Message)]
1313    pub struct WorkbookTemplateReferenceList {
1314        #[prost(message, repeated, tag = "1")]
1315        pub references: ::prost::alloc::vec::Vec<super::WorkbookTemplateReference>,
1316    }
1317    #[derive(Clone, PartialEq, ::prost::Oneof)]
1318    pub enum Option {
1319        /// TODO: add support for a field that contains a list of workbook template RIDs
1320        #[prost(message, tag = "1")]
1321        List(WorkbookTemplateReferenceList),
1322    }
1323}
1324/// A reference to a single workbook template
1325#[derive(Clone, PartialEq, ::prost::Message)]
1326pub struct WorkbookTemplateReference {
1327    #[prost(oneof = "workbook_template_reference::Option", tags = "1")]
1328    pub option: ::core::option::Option<workbook_template_reference::Option>,
1329}
1330/// Nested message and enum types in `WorkbookTemplateReference`.
1331pub mod workbook_template_reference {
1332    #[derive(Clone, PartialEq, ::prost::Oneof)]
1333    pub enum Option {
1334        /// A constant workbook template RID.
1335        ///
1336        /// string field_id = 2;
1337        #[prost(string, tag = "1")]
1338        Rid(::prost::alloc::string::String),
1339    }
1340}
1341/// A reference to multiple checklists
1342#[derive(Clone, PartialEq, ::prost::Message)]
1343pub struct MultiChecklistReference {
1344    #[prost(oneof = "multi_checklist_reference::Option", tags = "1")]
1345    pub option: ::core::option::Option<multi_checklist_reference::Option>,
1346}
1347/// Nested message and enum types in `MultiChecklistReference`.
1348pub mod multi_checklist_reference {
1349    #[derive(Clone, PartialEq, ::prost::Message)]
1350    pub struct ChecklistReferenceList {
1351        #[prost(message, repeated, tag = "1")]
1352        pub references: ::prost::alloc::vec::Vec<super::ChecklistReference>,
1353    }
1354    #[derive(Clone, PartialEq, ::prost::Oneof)]
1355    pub enum Option {
1356        /// TODO: add support for a field that contains a list of checklist RIDs
1357        #[prost(message, tag = "1")]
1358        List(ChecklistReferenceList),
1359    }
1360}
1361/// A reference to a single checklist
1362#[derive(Clone, PartialEq, ::prost::Message)]
1363pub struct ChecklistReference {
1364    #[prost(oneof = "checklist_reference::Option", tags = "1")]
1365    pub option: ::core::option::Option<checklist_reference::Option>,
1366}
1367/// Nested message and enum types in `ChecklistReference`.
1368pub mod checklist_reference {
1369    #[derive(Clone, PartialEq, ::prost::Oneof)]
1370    pub enum Option {
1371        /// A constant checklist RID.
1372        ///
1373        /// string field_id = 2;
1374        #[prost(string, tag = "1")]
1375        Rid(::prost::alloc::string::String),
1376    }
1377}
1378/// A reference to multiple notification Integrations
1379#[derive(Clone, PartialEq, ::prost::Message)]
1380pub struct MultiIntegrationReference {
1381    #[prost(oneof = "multi_integration_reference::Option", tags = "1")]
1382    pub option: ::core::option::Option<multi_integration_reference::Option>,
1383}
1384/// Nested message and enum types in `MultiIntegrationReference`.
1385pub mod multi_integration_reference {
1386    #[derive(Clone, PartialEq, ::prost::Message)]
1387    pub struct IntegrationReferenceList {
1388        #[prost(message, repeated, tag = "1")]
1389        pub references: ::prost::alloc::vec::Vec<super::IntegrationReference>,
1390    }
1391    #[derive(Clone, PartialEq, ::prost::Oneof)]
1392    pub enum Option {
1393        #[prost(message, tag = "1")]
1394        List(IntegrationReferenceList),
1395    }
1396}
1397/// A reference to a notification Integration
1398#[derive(Clone, PartialEq, ::prost::Message)]
1399pub struct IntegrationReference {
1400    #[prost(oneof = "integration_reference::Option", tags = "1")]
1401    pub option: ::core::option::Option<integration_reference::Option>,
1402}
1403/// Nested message and enum types in `IntegrationReference`.
1404pub mod integration_reference {
1405    #[derive(Clone, PartialEq, ::prost::Oneof)]
1406    pub enum Option {
1407        /// A constant integration RID.
1408        ///
1409        /// string field_id = 2;
1410        #[prost(string, tag = "1")]
1411        Rid(::prost::alloc::string::String),
1412    }
1413}
1414/// A field to be filled out by the user.
1415#[derive(Clone, PartialEq, ::prost::Message)]
1416pub struct FormField {
1417    /// This field's id can be used by downstream steps to refer to the value.
1418    #[prost(string, tag = "1")]
1419    pub id: ::prost::alloc::string::String,
1420    /// UI label for the field component. Overrides any label defined in the specific FormField type.
1421    #[prost(string, optional, tag = "11")]
1422    pub label: ::core::option::Option<::prost::alloc::string::String>,
1423    /// Help text describing how to use this input field.
1424    #[prost(string, optional, tag = "12")]
1425    pub description: ::core::option::Option<::prost::alloc::string::String>,
1426    #[prost(oneof = "form_field::Field", tags = "2, 3, 4, 5, 6, 7, 8, 9, 10")]
1427    pub field: ::core::option::Option<form_field::Field>,
1428}
1429/// Nested message and enum types in `FormField`.
1430pub mod form_field {
1431    #[derive(Clone, PartialEq, ::prost::Oneof)]
1432    pub enum Field {
1433        #[prost(message, tag = "2")]
1434        Asset(super::AssetField),
1435        #[prost(message, tag = "3")]
1436        Checkbox(super::CheckboxField),
1437        #[prost(message, tag = "4")]
1438        Text(super::TextField),
1439        #[prost(message, tag = "5")]
1440        Int(super::IntField),
1441        #[prost(message, tag = "6")]
1442        Double(super::DoubleField),
1443        #[prost(message, tag = "7")]
1444        SingleEnum(super::SingleEnumField),
1445        #[prost(message, tag = "8")]
1446        MultiEnum(super::MultiEnumField),
1447        #[prost(message, tag = "9")]
1448        FileUpload(super::FileUploadField),
1449        #[prost(message, tag = "10")]
1450        MultiFileUpload(super::MultiFileUploadField),
1451    }
1452}
1453/// A limited set of options to choose from, with an optional default option.
1454#[derive(Clone, PartialEq, ::prost::Message)]
1455pub struct PresetAssetFieldOptions {
1456    /// The list of options to choose from.
1457    #[prost(message, repeated, tag = "1")]
1458    pub options: ::prost::alloc::vec::Vec<AssetReference>,
1459    /// If set, this option will be selected by default, if it is present in the options.
1460    /// The user can still select a different option.
1461    #[prost(message, optional, tag = "2")]
1462    pub default_option: ::core::option::Option<AssetReference>,
1463}
1464/// A field to select a single asset.
1465#[derive(Clone, PartialEq, ::prost::Message)]
1466pub struct AssetField {
1467    /// Helper text to guide selection of the asset
1468    /// deprecated in favor of label directly on FormField
1469    #[prost(string, tag = "1")]
1470    pub label: ::prost::alloc::string::String,
1471    /// Whether this field is required to be set complete the step.
1472    #[prost(bool, tag = "2")]
1473    pub is_required: bool,
1474    /// The asset options for this field.
1475    /// This can be omitted, in which case the asset can be chosen freely from all assets.
1476    #[prost(oneof = "asset_field::Options", tags = "3")]
1477    pub options: ::core::option::Option<asset_field::Options>,
1478}
1479/// Nested message and enum types in `AssetField`.
1480pub mod asset_field {
1481    /// The asset options for this field.
1482    /// This can be omitted, in which case the asset can be chosen freely from all assets.
1483    #[derive(Clone, PartialEq, ::prost::Oneof)]
1484    pub enum Options {
1485        /// The asset must be chosen from a saved view.
1486        /// SavedViewRid saved_view = 5;
1487        /// TODO(pchen): do we want to provide single string types from AssetFieldOption to simplify the Nested
1488        /// or do we want to explicitly modify the types Nested spec uses?
1489        #[prost(message, tag = "3")]
1490        PresetOptions(super::PresetAssetFieldOptions),
1491    }
1492}
1493/// A field to capture a boolean value.
1494#[derive(Clone, PartialEq, ::prost::Message)]
1495pub struct CheckboxField {
1496    /// Label to show for this checkbox field
1497    /// deprecated in favor of label directly on FormField
1498    #[prost(string, tag = "1")]
1499    pub label: ::prost::alloc::string::String,
1500    /// If set, the checkbox value must be checked (`true`) to complete the step.
1501    #[prost(bool, tag = "2")]
1502    pub is_required: bool,
1503}
1504#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1505pub struct TextFieldSimpleInputType {}
1506#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1507pub struct TextFieldMarkdownInputType {}
1508/// A field to capture a string value.
1509#[derive(Clone, PartialEq, ::prost::Message)]
1510pub struct TextField {
1511    /// Label to show for this text field
1512    /// deprecated in favor of label directly on FormField
1513    #[prost(string, tag = "1")]
1514    pub label: ::prost::alloc::string::String,
1515    /// if set, validate that input is at least this many characters
1516    /// `is_required` can be achieved by setting `min_length >= 1`
1517    #[prost(uint32, optional, tag = "4")]
1518    pub min_length: ::core::option::Option<u32>,
1519    /// if set, validate that input is at most this many characters
1520    #[prost(uint32, optional, tag = "5")]
1521    pub max_length: ::core::option::Option<u32>,
1522    /// type of form input to render. Defaults to SIMPLE.
1523    #[prost(oneof = "text_field::InputType", tags = "2, 3")]
1524    pub input_type: ::core::option::Option<text_field::InputType>,
1525}
1526/// Nested message and enum types in `TextField`.
1527pub mod text_field {
1528    /// type of form input to render. Defaults to SIMPLE.
1529    #[derive(Clone, Copy, PartialEq, ::prost::Oneof)]
1530    pub enum InputType {
1531        /// renders a simple html text input field
1532        #[prost(message, tag = "2")]
1533        Simple(super::TextFieldSimpleInputType),
1534        /// renders a Markdown editor for longer inputs with formatting capabilities
1535        #[prost(message, tag = "3")]
1536        Markdown(super::TextFieldMarkdownInputType),
1537    }
1538}
1539/// A field to capture an int value.
1540#[derive(Clone, PartialEq, ::prost::Message)]
1541pub struct IntField {
1542    /// Label to show for this int field
1543    /// deprecated in favor of label directly on FormField
1544    #[prost(string, tag = "1")]
1545    pub label: ::prost::alloc::string::String,
1546    /// Whether this field is required to be set complete the step.
1547    #[prost(bool, tag = "2")]
1548    pub is_required: bool,
1549    /// if set, validate that input is at least this value
1550    #[prost(int64, optional, tag = "3")]
1551    pub gte_value: ::core::option::Option<i64>,
1552    /// if set, validate that input is at most this value
1553    #[prost(int64, optional, tag = "4")]
1554    pub lte_value: ::core::option::Option<i64>,
1555}
1556/// A field to capture a double value.
1557#[derive(Clone, PartialEq, ::prost::Message)]
1558pub struct DoubleField {
1559    /// Label to show for this double field
1560    /// deprecated in favor of label directly on FormField
1561    #[prost(string, tag = "1")]
1562    pub label: ::prost::alloc::string::String,
1563    /// Whether this field is required to be set complete the step.
1564    #[prost(bool, tag = "2")]
1565    pub is_required: bool,
1566    /// if set, a validation on the lower bound of the input value
1567    #[prost(oneof = "double_field::LowerBound", tags = "3, 4")]
1568    pub lower_bound: ::core::option::Option<double_field::LowerBound>,
1569    /// if set, a validation on the upper bound of the input value
1570    #[prost(oneof = "double_field::UpperBound", tags = "5, 6")]
1571    pub upper_bound: ::core::option::Option<double_field::UpperBound>,
1572}
1573/// Nested message and enum types in `DoubleField`.
1574pub mod double_field {
1575    /// if set, a validation on the lower bound of the input value
1576    #[derive(Clone, Copy, PartialEq, ::prost::Oneof)]
1577    pub enum LowerBound {
1578        /// greater than
1579        #[prost(double, tag = "3")]
1580        GtValue(f64),
1581        /// greater than or equal to
1582        #[prost(double, tag = "4")]
1583        GteValue(f64),
1584    }
1585    /// if set, a validation on the upper bound of the input value
1586    #[derive(Clone, Copy, PartialEq, ::prost::Oneof)]
1587    pub enum UpperBound {
1588        /// less than
1589        #[prost(double, tag = "5")]
1590        LtValue(f64),
1591        /// less than or equal to
1592        #[prost(double, tag = "6")]
1593        LteValue(f64),
1594    }
1595}
1596#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1597pub struct EnumFieldButtonsInputType {}
1598#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1599pub struct EnumFieldMenuInputType {}
1600/// A field to capture one of several options.
1601#[derive(Clone, PartialEq, ::prost::Message)]
1602pub struct SingleEnumField {
1603    /// Label to show for this options field
1604    /// deprecated in favor of label directly on FormField
1605    #[prost(string, tag = "1")]
1606    pub label: ::prost::alloc::string::String,
1607    /// List of predefined options that can be selected by the user
1608    #[prost(string, repeated, tag = "2")]
1609    pub options: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1610    /// Whether a user can create and specify a new custom option not in the list of options.
1611    #[prost(bool, tag = "5")]
1612    pub allow_custom: bool,
1613    /// Whether a selection is required
1614    #[prost(bool, tag = "6")]
1615    pub is_required: bool,
1616    /// type of form input to render.
1617    #[prost(oneof = "single_enum_field::InputType", tags = "3, 4")]
1618    pub input_type: ::core::option::Option<single_enum_field::InputType>,
1619}
1620/// Nested message and enum types in `SingleEnumField`.
1621pub mod single_enum_field {
1622    /// type of form input to render.
1623    #[derive(Clone, Copy, PartialEq, ::prost::Oneof)]
1624    pub enum InputType {
1625        /// renders a radio button component
1626        #[prost(message, tag = "3")]
1627        Buttons(super::EnumFieldButtonsInputType),
1628        /// renders a typical drop down menu
1629        #[prost(message, tag = "4")]
1630        Dropdown(super::EnumFieldMenuInputType),
1631    }
1632}
1633/// A field to capture one or more of several options.
1634#[derive(Clone, PartialEq, ::prost::Message)]
1635pub struct MultiEnumField {
1636    /// Label to show for this options field
1637    /// deprecated in favor of label directly on FormField
1638    #[prost(string, tag = "1")]
1639    pub label: ::prost::alloc::string::String,
1640    /// List of predefined options that can be selected by the user
1641    #[prost(string, repeated, tag = "2")]
1642    pub options: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1643    /// Whether a user can create and specify a new custom option not in the list of options.
1644    #[prost(bool, tag = "6")]
1645    pub allow_custom: bool,
1646    /// If set, the user must select at least this many options
1647    /// `is_required` behavior can be achieved by setting `min_count` = 1
1648    #[prost(uint32, optional, tag = "7")]
1649    pub min_count: ::core::option::Option<u32>,
1650    /// If set, the user can select at most this many options
1651    #[prost(uint32, optional, tag = "8")]
1652    pub max_count: ::core::option::Option<u32>,
1653    /// type of form input to render.
1654    #[prost(oneof = "multi_enum_field::InputType", tags = "3, 4")]
1655    pub input_type: ::core::option::Option<multi_enum_field::InputType>,
1656}
1657/// Nested message and enum types in `MultiEnumField`.
1658pub mod multi_enum_field {
1659    /// type of form input to render.
1660    #[derive(Clone, Copy, PartialEq, ::prost::Oneof)]
1661    pub enum InputType {
1662        /// renders a collection of checkboxes
1663        #[prost(message, tag = "3")]
1664        Buttons(super::EnumFieldButtonsInputType),
1665        /// renders a typical drop down menu
1666        #[prost(message, tag = "4")]
1667        Dropdown(super::EnumFieldMenuInputType),
1668    }
1669}
1670/// A field to process the uploading of a file
1671#[derive(Clone, PartialEq, ::prost::Message)]
1672pub struct FileUploadField {
1673    /// If a file is required
1674    #[prost(bool, tag = "1")]
1675    pub is_required: bool,
1676    /// Optional list of case insensitive suffixes to filter files. (ie "csv", "parquet", or "json")
1677    #[prost(string, repeated, tag = "2")]
1678    pub suffix_filters: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1679}
1680/// A field to process the uploading of a dynamic set of files
1681#[derive(Clone, PartialEq, ::prost::Message)]
1682pub struct MultiFileUploadField {
1683    /// Count of required files
1684    #[prost(uint32, optional, tag = "1")]
1685    pub min_count: ::core::option::Option<u32>,
1686    /// File count limit
1687    #[prost(uint32, optional, tag = "2")]
1688    pub max_count: ::core::option::Option<u32>,
1689    /// Optional list of case insensitive suffixes to filter files. (ie "csv", "parquet", or "json")
1690    #[prost(string, repeated, tag = "3")]
1691    pub suffix_filters: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1692}
1693/// Metadata about a procedure that is not part of the versioned state.
1694#[derive(Clone, PartialEq, ::prost::Message)]
1695pub struct ProcedureMetadata {
1696    #[prost(string, tag = "1")]
1697    pub rid: ::prost::alloc::string::String,
1698    #[prost(string, tag = "2")]
1699    pub title: ::prost::alloc::string::String,
1700    #[prost(string, optional, tag = "3")]
1701    pub description: ::core::option::Option<::prost::alloc::string::String>,
1702    #[prost(string, repeated, tag = "4")]
1703    pub labels: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1704    #[prost(map = "string, string", tag = "5")]
1705    pub properties: ::std::collections::HashMap<
1706        ::prost::alloc::string::String,
1707        ::prost::alloc::string::String,
1708    >,
1709    #[prost(bool, tag = "6")]
1710    pub is_archived: bool,
1711    #[prost(bool, tag = "7")]
1712    pub is_published: bool,
1713    #[prost(message, optional, tag = "8")]
1714    pub created_at: ::core::option::Option<
1715        super::super::super::google::protobuf::Timestamp,
1716    >,
1717    #[prost(string, tag = "9")]
1718    pub created_by: ::prost::alloc::string::String,
1719    #[prost(message, optional, tag = "10")]
1720    pub updated_at: ::core::option::Option<
1721        super::super::super::google::protobuf::Timestamp,
1722    >,
1723    #[prost(string, tag = "11")]
1724    pub updated_by: ::prost::alloc::string::String,
1725    #[prost(string, tag = "12")]
1726    pub workspace: ::prost::alloc::string::String,
1727}
1728/// A procedure describes a series of steps to be performed, typically in a specific order,
1729#[derive(Clone, PartialEq, ::prost::Message)]
1730pub struct Procedure {
1731    /// The RID of the procedure.
1732    #[prost(string, tag = "1")]
1733    pub rid: ::prost::alloc::string::String,
1734    /// The commit ID of this version of the procedure.
1735    #[prost(string, tag = "2")]
1736    pub commit: ::prost::alloc::string::String,
1737    /// Metadata about the procedure.
1738    #[prost(message, optional, tag = "3")]
1739    pub metadata: ::core::option::Option<ProcedureMetadata>,
1740    /// The versioned state of the procedure.
1741    #[prost(message, optional, tag = "4")]
1742    pub state: ::core::option::Option<ProcedureState>,
1743}
1744#[derive(Clone, PartialEq, ::prost::Message)]
1745pub struct CreateProcedureRequest {
1746    #[prost(string, tag = "1")]
1747    pub title: ::prost::alloc::string::String,
1748    #[prost(string, optional, tag = "2")]
1749    pub description: ::core::option::Option<::prost::alloc::string::String>,
1750    #[prost(string, repeated, tag = "3")]
1751    pub labels: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1752    #[prost(map = "string, string", tag = "4")]
1753    pub properties: ::std::collections::HashMap<
1754        ::prost::alloc::string::String,
1755        ::prost::alloc::string::String,
1756    >,
1757    #[prost(message, optional, tag = "5")]
1758    pub state: ::core::option::Option<ProcedureState>,
1759    #[prost(bool, optional, tag = "6")]
1760    pub is_published: ::core::option::Option<bool>,
1761    #[prost(string, tag = "7")]
1762    pub workspace: ::prost::alloc::string::String,
1763    #[prost(string, tag = "8")]
1764    pub commit_message: ::prost::alloc::string::String,
1765    #[prost(string, optional, tag = "9")]
1766    pub initial_branch_name: ::core::option::Option<::prost::alloc::string::String>,
1767}
1768#[derive(Clone, PartialEq, ::prost::Message)]
1769pub struct CreateProcedureResponse {
1770    #[prost(message, optional, tag = "1")]
1771    pub procedure: ::core::option::Option<Procedure>,
1772    #[prost(string, optional, tag = "2")]
1773    pub branch_name: ::core::option::Option<::prost::alloc::string::String>,
1774}
1775#[derive(Clone, PartialEq, ::prost::Message)]
1776pub struct GetProcedureRequest {
1777    #[prost(string, tag = "1")]
1778    pub rid: ::prost::alloc::string::String,
1779    #[prost(message, optional, tag = "2")]
1780    pub branch_or_commit: ::core::option::Option<
1781        super::super::versioning::v1::BranchOrCommit,
1782    >,
1783    /// If true, the display graph will be included in the response.
1784    /// Default is false.
1785    #[prost(bool, tag = "3")]
1786    pub include_display_graph: bool,
1787}
1788#[derive(Clone, PartialEq, ::prost::Message)]
1789pub struct GetProcedureResponse {
1790    #[prost(message, optional, tag = "1")]
1791    pub procedure: ::core::option::Option<Procedure>,
1792    /// Included if include_display_graph was set to true
1793    #[prost(message, optional, tag = "2")]
1794    pub display_graph: ::core::option::Option<ProcedureDisplayGraph>,
1795}
1796#[derive(Clone, PartialEq, ::prost::Message)]
1797pub struct BatchGetProcedureMetadataRequest {
1798    #[prost(string, repeated, tag = "1")]
1799    pub procedure_rids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1800}
1801#[derive(Clone, PartialEq, ::prost::Message)]
1802pub struct BatchGetProcedureMetadataResponse {
1803    #[prost(message, repeated, tag = "1")]
1804    pub procedure_metadatas: ::prost::alloc::vec::Vec<ProcedureMetadata>,
1805}
1806#[derive(Clone, PartialEq, ::prost::Message)]
1807pub struct UpdateProcedureMetadataRequest {
1808    #[prost(string, tag = "1")]
1809    pub rid: ::prost::alloc::string::String,
1810    #[prost(string, optional, tag = "2")]
1811    pub title: ::core::option::Option<::prost::alloc::string::String>,
1812    #[prost(string, optional, tag = "3")]
1813    pub description: ::core::option::Option<::prost::alloc::string::String>,
1814    #[prost(message, optional, tag = "4")]
1815    pub labels: ::core::option::Option<super::super::types::LabelUpdateWrapper>,
1816    #[prost(message, optional, tag = "5")]
1817    pub properties: ::core::option::Option<super::super::types::PropertyUpdateWrapper>,
1818    #[prost(bool, optional, tag = "6")]
1819    pub is_archived: ::core::option::Option<bool>,
1820    #[prost(bool, optional, tag = "7")]
1821    pub is_published: ::core::option::Option<bool>,
1822}
1823#[derive(Clone, PartialEq, ::prost::Message)]
1824pub struct UpdateProcedureMetadataResponse {
1825    #[prost(message, optional, tag = "1")]
1826    pub procedure_metadata: ::core::option::Option<ProcedureMetadata>,
1827}
1828#[derive(Clone, PartialEq, ::prost::Message)]
1829pub struct ParseNestedProcedureRequest {
1830    #[prost(message, optional, tag = "1")]
1831    pub nested_procedure: ::core::option::Option<NestedProcedure>,
1832    /// If true, the display graph will be included in the response.
1833    /// Default is false.
1834    #[prost(bool, tag = "3")]
1835    pub include_display_graph: bool,
1836}
1837#[derive(Clone, PartialEq, ::prost::Message)]
1838pub struct ParseNestedProcedureResponse {
1839    #[prost(message, optional, tag = "1")]
1840    pub procedure: ::core::option::Option<Procedure>,
1841    /// Included if include_display_graph was set to true
1842    #[prost(message, optional, tag = "2")]
1843    pub display_graph: ::core::option::Option<ProcedureDisplayGraph>,
1844}
1845#[derive(Clone, PartialEq, ::prost::Message)]
1846pub struct GetProcedureAsNestedRequest {
1847    #[prost(string, tag = "1")]
1848    pub rid: ::prost::alloc::string::String,
1849    #[prost(message, optional, tag = "2")]
1850    pub branch_or_commit: ::core::option::Option<
1851        super::super::versioning::v1::BranchOrCommit,
1852    >,
1853}
1854#[derive(Clone, PartialEq, ::prost::Message)]
1855pub struct GetProcedureAsNestedResponse {
1856    #[prost(message, optional, tag = "1")]
1857    pub nested_procedure: ::core::option::Option<NestedProcedure>,
1858}
1859#[derive(Clone, PartialEq, ::prost::Message)]
1860pub struct MergeToMainRequest {
1861    #[prost(string, tag = "1")]
1862    pub rid: ::prost::alloc::string::String,
1863    #[prost(string, tag = "2")]
1864    pub branch: ::prost::alloc::string::String,
1865    /// If present, this commit ID must match the latest commit on main for the merge to succeed.
1866    #[prost(string, optional, tag = "3")]
1867    pub latest_commit_on_main: ::core::option::Option<::prost::alloc::string::String>,
1868    #[prost(string, tag = "4")]
1869    pub message: ::prost::alloc::string::String,
1870}
1871#[derive(Clone, PartialEq, ::prost::Message)]
1872pub struct MergeToMainResponse {
1873    #[prost(message, optional, tag = "1")]
1874    pub procedure: ::core::option::Option<Procedure>,
1875}
1876#[derive(Clone, PartialEq, ::prost::Message)]
1877pub struct SaveWorkingStateRequest {
1878    #[prost(string, tag = "1")]
1879    pub rid: ::prost::alloc::string::String,
1880    #[prost(string, optional, tag = "2")]
1881    pub branch: ::core::option::Option<::prost::alloc::string::String>,
1882    #[prost(string, tag = "3")]
1883    pub message: ::prost::alloc::string::String,
1884    /// If present, this commit ID must match the latest commit on the branch for the save to succeed.
1885    #[prost(string, optional, tag = "4")]
1886    pub latest_commit_on_branch: ::core::option::Option<::prost::alloc::string::String>,
1887    #[prost(message, optional, tag = "5")]
1888    pub state: ::core::option::Option<ProcedureState>,
1889}
1890#[derive(Clone, PartialEq, ::prost::Message)]
1891pub struct SaveWorkingStateResponse {
1892    #[prost(message, optional, tag = "1")]
1893    pub procedure: ::core::option::Option<Procedure>,
1894}
1895#[derive(Clone, PartialEq, ::prost::Message)]
1896pub struct CommitRequest {
1897    #[prost(string, tag = "1")]
1898    pub rid: ::prost::alloc::string::String,
1899    #[prost(string, optional, tag = "2")]
1900    pub branch: ::core::option::Option<::prost::alloc::string::String>,
1901    /// If present, this commit ID must match the latest commit on the branch for the commit to succeed.
1902    #[prost(string, optional, tag = "3")]
1903    pub latest_commit_on_branch: ::core::option::Option<::prost::alloc::string::String>,
1904    #[prost(string, tag = "4")]
1905    pub message: ::prost::alloc::string::String,
1906    #[prost(message, optional, tag = "5")]
1907    pub state: ::core::option::Option<ProcedureState>,
1908}
1909#[derive(Clone, PartialEq, ::prost::Message)]
1910pub struct CommitResponse {
1911    #[prost(message, optional, tag = "1")]
1912    pub procedure: ::core::option::Option<Procedure>,
1913}
1914#[derive(Clone, PartialEq, ::prost::Message)]
1915pub struct ProcedureSearchQuery {
1916    #[prost(oneof = "procedure_search_query::Query", tags = "1, 2, 3, 4, 5, 6, 7, 8")]
1917    pub query: ::core::option::Option<procedure_search_query::Query>,
1918}
1919/// Nested message and enum types in `ProcedureSearchQuery`.
1920pub mod procedure_search_query {
1921    #[derive(Clone, PartialEq, ::prost::Message)]
1922    pub struct ProcedureSearchAndQuery {
1923        #[prost(message, repeated, tag = "1")]
1924        pub queries: ::prost::alloc::vec::Vec<super::ProcedureSearchQuery>,
1925    }
1926    #[derive(Clone, PartialEq, ::prost::Message)]
1927    pub struct ProcedureSearchOrQuery {
1928        #[prost(message, repeated, tag = "1")]
1929        pub queries: ::prost::alloc::vec::Vec<super::ProcedureSearchQuery>,
1930    }
1931    #[derive(Clone, PartialEq, ::prost::Oneof)]
1932    pub enum Query {
1933        #[prost(string, tag = "1")]
1934        SearchText(::prost::alloc::string::String),
1935        #[prost(string, tag = "2")]
1936        Label(::prost::alloc::string::String),
1937        #[prost(message, tag = "3")]
1938        Property(super::super::super::types::Property),
1939        #[prost(message, tag = "4")]
1940        And(ProcedureSearchAndQuery),
1941        #[prost(message, tag = "5")]
1942        Or(ProcedureSearchOrQuery),
1943        #[prost(string, tag = "6")]
1944        Workspace(::prost::alloc::string::String),
1945        #[prost(string, tag = "7")]
1946        CreatedBy(::prost::alloc::string::String),
1947        #[prost(bool, tag = "8")]
1948        IsArchived(bool),
1949    }
1950}
1951#[derive(Clone, Copy, PartialEq, ::prost::Message)]
1952pub struct SearchProceduresSortOptions {
1953    /// Defaults to true (descending)
1954    #[prost(bool, optional, tag = "1")]
1955    pub is_descending: ::core::option::Option<bool>,
1956    /// Defaults to CREATED_AT
1957    #[prost(enumeration = "SearchProceduresSortField", optional, tag = "2")]
1958    pub sort_field: ::core::option::Option<i32>,
1959}
1960#[derive(Clone, PartialEq, ::prost::Message)]
1961pub struct SearchProceduresRequest {
1962    #[prost(message, optional, tag = "1")]
1963    pub query: ::core::option::Option<ProcedureSearchQuery>,
1964    /// If not set, default is to sort by created_at descending
1965    #[prost(message, optional, tag = "2")]
1966    pub sort_options: ::core::option::Option<SearchProceduresSortOptions>,
1967    /// Page sizes greater than 1_000 will be rejected. Default pageSize is 100.
1968    #[prost(int32, optional, tag = "3")]
1969    pub page_size: ::core::option::Option<i32>,
1970    #[prost(string, optional, tag = "4")]
1971    pub next_page_token: ::core::option::Option<::prost::alloc::string::String>,
1972}
1973#[derive(Clone, PartialEq, ::prost::Message)]
1974pub struct SearchProceduresResponse {
1975    #[prost(message, repeated, tag = "1")]
1976    pub procedure_metadata: ::prost::alloc::vec::Vec<ProcedureMetadata>,
1977    #[prost(string, optional, tag = "2")]
1978    pub next_page_token: ::core::option::Option<::prost::alloc::string::String>,
1979}
1980#[derive(Clone, PartialEq, ::prost::Message)]
1981pub struct ArchiveProceduresRequest {
1982    #[prost(string, repeated, tag = "1")]
1983    pub procedure_rids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1984}
1985#[derive(Clone, PartialEq, ::prost::Message)]
1986pub struct ArchiveProceduresResponse {
1987    #[prost(string, repeated, tag = "1")]
1988    pub procedure_rids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1989}
1990#[derive(Clone, PartialEq, ::prost::Message)]
1991pub struct UnarchiveProceduresRequest {
1992    #[prost(string, repeated, tag = "1")]
1993    pub procedure_rids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1994}
1995#[derive(Clone, PartialEq, ::prost::Message)]
1996pub struct UnarchiveProceduresResponse {
1997    #[prost(string, repeated, tag = "1")]
1998    pub procedure_rids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
1999}
2000#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
2001#[repr(i32)]
2002pub enum SearchProceduresSortField {
2003    Unspecified = 0,
2004    Name = 1,
2005    CreatedAt = 2,
2006    UpdatedAt = 3,
2007}
2008impl SearchProceduresSortField {
2009    /// String value of the enum field names used in the ProtoBuf definition.
2010    ///
2011    /// The values are not transformed in any way and thus are considered stable
2012    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
2013    pub fn as_str_name(&self) -> &'static str {
2014        match self {
2015            Self::Unspecified => "SEARCH_PROCEDURES_SORT_FIELD_UNSPECIFIED",
2016            Self::Name => "SEARCH_PROCEDURES_SORT_FIELD_NAME",
2017            Self::CreatedAt => "SEARCH_PROCEDURES_SORT_FIELD_CREATED_AT",
2018            Self::UpdatedAt => "SEARCH_PROCEDURES_SORT_FIELD_UPDATED_AT",
2019        }
2020    }
2021    /// Creates an enum from field names used in the ProtoBuf definition.
2022    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
2023        match value {
2024            "SEARCH_PROCEDURES_SORT_FIELD_UNSPECIFIED" => Some(Self::Unspecified),
2025            "SEARCH_PROCEDURES_SORT_FIELD_NAME" => Some(Self::Name),
2026            "SEARCH_PROCEDURES_SORT_FIELD_CREATED_AT" => Some(Self::CreatedAt),
2027            "SEARCH_PROCEDURES_SORT_FIELD_UPDATED_AT" => Some(Self::UpdatedAt),
2028            _ => None,
2029        }
2030    }
2031}
2032#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
2033#[repr(i32)]
2034pub enum ProceduresServiceError {
2035    Unspecified = 0,
2036    NotFound = 1,
2037    CommitNotFound = 2,
2038    CannotMergeMain = 3,
2039    CannotCommitToArchivedProcedure = 4,
2040    InvalidGraph = 5,
2041    InvalidSearchToken = 6,
2042}
2043impl ProceduresServiceError {
2044    /// String value of the enum field names used in the ProtoBuf definition.
2045    ///
2046    /// The values are not transformed in any way and thus are considered stable
2047    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
2048    pub fn as_str_name(&self) -> &'static str {
2049        match self {
2050            Self::Unspecified => "PROCEDURES_SERVICE_ERROR_UNSPECIFIED",
2051            Self::NotFound => "PROCEDURES_SERVICE_ERROR_NOT_FOUND",
2052            Self::CommitNotFound => "PROCEDURES_SERVICE_ERROR_COMMIT_NOT_FOUND",
2053            Self::CannotMergeMain => "PROCEDURES_SERVICE_ERROR_CANNOT_MERGE_MAIN",
2054            Self::CannotCommitToArchivedProcedure => {
2055                "PROCEDURES_SERVICE_ERROR_CANNOT_COMMIT_TO_ARCHIVED_PROCEDURE"
2056            }
2057            Self::InvalidGraph => "PROCEDURES_SERVICE_ERROR_INVALID_GRAPH",
2058            Self::InvalidSearchToken => "PROCEDURES_SERVICE_ERROR_INVALID_SEARCH_TOKEN",
2059        }
2060    }
2061    /// Creates an enum from field names used in the ProtoBuf definition.
2062    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
2063        match value {
2064            "PROCEDURES_SERVICE_ERROR_UNSPECIFIED" => Some(Self::Unspecified),
2065            "PROCEDURES_SERVICE_ERROR_NOT_FOUND" => Some(Self::NotFound),
2066            "PROCEDURES_SERVICE_ERROR_COMMIT_NOT_FOUND" => Some(Self::CommitNotFound),
2067            "PROCEDURES_SERVICE_ERROR_CANNOT_MERGE_MAIN" => Some(Self::CannotMergeMain),
2068            "PROCEDURES_SERVICE_ERROR_CANNOT_COMMIT_TO_ARCHIVED_PROCEDURE" => {
2069                Some(Self::CannotCommitToArchivedProcedure)
2070            }
2071            "PROCEDURES_SERVICE_ERROR_INVALID_GRAPH" => Some(Self::InvalidGraph),
2072            "PROCEDURES_SERVICE_ERROR_INVALID_SEARCH_TOKEN" => {
2073                Some(Self::InvalidSearchToken)
2074            }
2075            _ => None,
2076        }
2077    }
2078}
2079/// Generated client implementations.
2080pub mod procedures_service_client {
2081    #![allow(
2082        unused_variables,
2083        dead_code,
2084        missing_docs,
2085        clippy::wildcard_imports,
2086        clippy::let_unit_value,
2087    )]
2088    use tonic::codegen::*;
2089    use tonic::codegen::http::Uri;
2090    /// Service for creating and managing procedure templates, which are versioned collections
2091    /// of steps to be performed, typically in a specific order.
2092    #[derive(Debug, Clone)]
2093    pub struct ProceduresServiceClient<T> {
2094        inner: tonic::client::Grpc<T>,
2095    }
2096    impl ProceduresServiceClient<tonic::transport::Channel> {
2097        /// Attempt to create a new client by connecting to a given endpoint.
2098        pub async fn connect<D>(dst: D) -> Result<Self, tonic::transport::Error>
2099        where
2100            D: TryInto<tonic::transport::Endpoint>,
2101            D::Error: Into<StdError>,
2102        {
2103            let conn = tonic::transport::Endpoint::new(dst)?.connect().await?;
2104            Ok(Self::new(conn))
2105        }
2106    }
2107    impl<T> ProceduresServiceClient<T>
2108    where
2109        T: tonic::client::GrpcService<tonic::body::Body>,
2110        T::Error: Into<StdError>,
2111        T::ResponseBody: Body<Data = Bytes> + std::marker::Send + 'static,
2112        <T::ResponseBody as Body>::Error: Into<StdError> + std::marker::Send,
2113    {
2114        pub fn new(inner: T) -> Self {
2115            let inner = tonic::client::Grpc::new(inner);
2116            Self { inner }
2117        }
2118        pub fn with_origin(inner: T, origin: Uri) -> Self {
2119            let inner = tonic::client::Grpc::with_origin(inner, origin);
2120            Self { inner }
2121        }
2122        pub fn with_interceptor<F>(
2123            inner: T,
2124            interceptor: F,
2125        ) -> ProceduresServiceClient<InterceptedService<T, F>>
2126        where
2127            F: tonic::service::Interceptor,
2128            T::ResponseBody: Default,
2129            T: tonic::codegen::Service<
2130                http::Request<tonic::body::Body>,
2131                Response = http::Response<
2132                    <T as tonic::client::GrpcService<tonic::body::Body>>::ResponseBody,
2133                >,
2134            >,
2135            <T as tonic::codegen::Service<
2136                http::Request<tonic::body::Body>,
2137            >>::Error: Into<StdError> + std::marker::Send + std::marker::Sync,
2138        {
2139            ProceduresServiceClient::new(InterceptedService::new(inner, interceptor))
2140        }
2141        /// Compress requests with the given encoding.
2142        ///
2143        /// This requires the server to support it otherwise it might respond with an
2144        /// error.
2145        #[must_use]
2146        pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
2147            self.inner = self.inner.send_compressed(encoding);
2148            self
2149        }
2150        /// Enable decompressing responses.
2151        #[must_use]
2152        pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
2153            self.inner = self.inner.accept_compressed(encoding);
2154            self
2155        }
2156        /// Limits the maximum size of a decoded message.
2157        ///
2158        /// Default: `4MB`
2159        #[must_use]
2160        pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
2161            self.inner = self.inner.max_decoding_message_size(limit);
2162            self
2163        }
2164        /// Limits the maximum size of an encoded message.
2165        ///
2166        /// Default: `usize::MAX`
2167        #[must_use]
2168        pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
2169            self.inner = self.inner.max_encoding_message_size(limit);
2170            self
2171        }
2172        /// Create a new procedure
2173        pub async fn create_procedure(
2174            &mut self,
2175            request: impl tonic::IntoRequest<super::CreateProcedureRequest>,
2176        ) -> std::result::Result<
2177            tonic::Response<super::CreateProcedureResponse>,
2178            tonic::Status,
2179        > {
2180            self.inner
2181                .ready()
2182                .await
2183                .map_err(|e| {
2184                    tonic::Status::unknown(
2185                        format!("Service was not ready: {}", e.into()),
2186                    )
2187                })?;
2188            let codec = tonic::codec::ProstCodec::default();
2189            let path = http::uri::PathAndQuery::from_static(
2190                "/nominal.procedures.v1.ProceduresService/CreateProcedure",
2191            );
2192            let mut req = request.into_request();
2193            req.extensions_mut()
2194                .insert(
2195                    GrpcMethod::new(
2196                        "nominal.procedures.v1.ProceduresService",
2197                        "CreateProcedure",
2198                    ),
2199                );
2200            self.inner.unary(req, path, codec).await
2201        }
2202        /// Get a procedure by its RID
2203        pub async fn get_procedure(
2204            &mut self,
2205            request: impl tonic::IntoRequest<super::GetProcedureRequest>,
2206        ) -> std::result::Result<
2207            tonic::Response<super::GetProcedureResponse>,
2208            tonic::Status,
2209        > {
2210            self.inner
2211                .ready()
2212                .await
2213                .map_err(|e| {
2214                    tonic::Status::unknown(
2215                        format!("Service was not ready: {}", e.into()),
2216                    )
2217                })?;
2218            let codec = tonic::codec::ProstCodec::default();
2219            let path = http::uri::PathAndQuery::from_static(
2220                "/nominal.procedures.v1.ProceduresService/GetProcedure",
2221            );
2222            let mut req = request.into_request();
2223            req.extensions_mut()
2224                .insert(
2225                    GrpcMethod::new(
2226                        "nominal.procedures.v1.ProceduresService",
2227                        "GetProcedure",
2228                    ),
2229                );
2230            self.inner.unary(req, path, codec).await
2231        }
2232        /// Get metadata for multiple procedure by RIDs.
2233        /// Unauthorized RIDs will be omitted from the response.
2234        /// Order is not guaranteed to match the request.
2235        pub async fn batch_get_procedure_metadata(
2236            &mut self,
2237            request: impl tonic::IntoRequest<super::BatchGetProcedureMetadataRequest>,
2238        ) -> std::result::Result<
2239            tonic::Response<super::BatchGetProcedureMetadataResponse>,
2240            tonic::Status,
2241        > {
2242            self.inner
2243                .ready()
2244                .await
2245                .map_err(|e| {
2246                    tonic::Status::unknown(
2247                        format!("Service was not ready: {}", e.into()),
2248                    )
2249                })?;
2250            let codec = tonic::codec::ProstCodec::default();
2251            let path = http::uri::PathAndQuery::from_static(
2252                "/nominal.procedures.v1.ProceduresService/BatchGetProcedureMetadata",
2253            );
2254            let mut req = request.into_request();
2255            req.extensions_mut()
2256                .insert(
2257                    GrpcMethod::new(
2258                        "nominal.procedures.v1.ProceduresService",
2259                        "BatchGetProcedureMetadata",
2260                    ),
2261                );
2262            self.inner.unary(req, path, codec).await
2263        }
2264        /// Update the metadata of a procedure
2265        pub async fn update_procedure_metadata(
2266            &mut self,
2267            request: impl tonic::IntoRequest<super::UpdateProcedureMetadataRequest>,
2268        ) -> std::result::Result<
2269            tonic::Response<super::UpdateProcedureMetadataResponse>,
2270            tonic::Status,
2271        > {
2272            self.inner
2273                .ready()
2274                .await
2275                .map_err(|e| {
2276                    tonic::Status::unknown(
2277                        format!("Service was not ready: {}", e.into()),
2278                    )
2279                })?;
2280            let codec = tonic::codec::ProstCodec::default();
2281            let path = http::uri::PathAndQuery::from_static(
2282                "/nominal.procedures.v1.ProceduresService/UpdateProcedureMetadata",
2283            );
2284            let mut req = request.into_request();
2285            req.extensions_mut()
2286                .insert(
2287                    GrpcMethod::new(
2288                        "nominal.procedures.v1.ProceduresService",
2289                        "UpdateProcedureMetadata",
2290                    ),
2291                );
2292            self.inner.unary(req, path, codec).await
2293        }
2294        /// Parse a procedure from a nested procedure structure
2295        pub async fn parse_nested_procedure(
2296            &mut self,
2297            request: impl tonic::IntoRequest<super::ParseNestedProcedureRequest>,
2298        ) -> std::result::Result<
2299            tonic::Response<super::ParseNestedProcedureResponse>,
2300            tonic::Status,
2301        > {
2302            self.inner
2303                .ready()
2304                .await
2305                .map_err(|e| {
2306                    tonic::Status::unknown(
2307                        format!("Service was not ready: {}", e.into()),
2308                    )
2309                })?;
2310            let codec = tonic::codec::ProstCodec::default();
2311            let path = http::uri::PathAndQuery::from_static(
2312                "/nominal.procedures.v1.ProceduresService/ParseNestedProcedure",
2313            );
2314            let mut req = request.into_request();
2315            req.extensions_mut()
2316                .insert(
2317                    GrpcMethod::new(
2318                        "nominal.procedures.v1.ProceduresService",
2319                        "ParseNestedProcedure",
2320                    ),
2321                );
2322            self.inner.unary(req, path, codec).await
2323        }
2324        /// Get procedure as nested procedure
2325        /// TODO(pchen): in the future, not all graphs will be representable as nested procedures
2326        pub async fn get_procedure_as_nested(
2327            &mut self,
2328            request: impl tonic::IntoRequest<super::GetProcedureAsNestedRequest>,
2329        ) -> std::result::Result<
2330            tonic::Response<super::GetProcedureAsNestedResponse>,
2331            tonic::Status,
2332        > {
2333            self.inner
2334                .ready()
2335                .await
2336                .map_err(|e| {
2337                    tonic::Status::unknown(
2338                        format!("Service was not ready: {}", e.into()),
2339                    )
2340                })?;
2341            let codec = tonic::codec::ProstCodec::default();
2342            let path = http::uri::PathAndQuery::from_static(
2343                "/nominal.procedures.v1.ProceduresService/GetProcedureAsNested",
2344            );
2345            let mut req = request.into_request();
2346            req.extensions_mut()
2347                .insert(
2348                    GrpcMethod::new(
2349                        "nominal.procedures.v1.ProceduresService",
2350                        "GetProcedureAsNested",
2351                    ),
2352                );
2353            self.inner.unary(req, path, codec).await
2354        }
2355        /// Merge a branch of a procedure to main
2356        pub async fn merge_to_main(
2357            &mut self,
2358            request: impl tonic::IntoRequest<super::MergeToMainRequest>,
2359        ) -> std::result::Result<
2360            tonic::Response<super::MergeToMainResponse>,
2361            tonic::Status,
2362        > {
2363            self.inner
2364                .ready()
2365                .await
2366                .map_err(|e| {
2367                    tonic::Status::unknown(
2368                        format!("Service was not ready: {}", e.into()),
2369                    )
2370                })?;
2371            let codec = tonic::codec::ProstCodec::default();
2372            let path = http::uri::PathAndQuery::from_static(
2373                "/nominal.procedures.v1.ProceduresService/MergeToMain",
2374            );
2375            let mut req = request.into_request();
2376            req.extensions_mut()
2377                .insert(
2378                    GrpcMethod::new(
2379                        "nominal.procedures.v1.ProceduresService",
2380                        "MergeToMain",
2381                    ),
2382                );
2383            self.inner.unary(req, path, codec).await
2384        }
2385        /// Save the working state of a procedure
2386        pub async fn save_working_state(
2387            &mut self,
2388            request: impl tonic::IntoRequest<super::SaveWorkingStateRequest>,
2389        ) -> std::result::Result<
2390            tonic::Response<super::SaveWorkingStateResponse>,
2391            tonic::Status,
2392        > {
2393            self.inner
2394                .ready()
2395                .await
2396                .map_err(|e| {
2397                    tonic::Status::unknown(
2398                        format!("Service was not ready: {}", e.into()),
2399                    )
2400                })?;
2401            let codec = tonic::codec::ProstCodec::default();
2402            let path = http::uri::PathAndQuery::from_static(
2403                "/nominal.procedures.v1.ProceduresService/SaveWorkingState",
2404            );
2405            let mut req = request.into_request();
2406            req.extensions_mut()
2407                .insert(
2408                    GrpcMethod::new(
2409                        "nominal.procedures.v1.ProceduresService",
2410                        "SaveWorkingState",
2411                    ),
2412                );
2413            self.inner.unary(req, path, codec).await
2414        }
2415        /// Commit a procedure to a branch
2416        pub async fn commit(
2417            &mut self,
2418            request: impl tonic::IntoRequest<super::CommitRequest>,
2419        ) -> std::result::Result<tonic::Response<super::CommitResponse>, tonic::Status> {
2420            self.inner
2421                .ready()
2422                .await
2423                .map_err(|e| {
2424                    tonic::Status::unknown(
2425                        format!("Service was not ready: {}", e.into()),
2426                    )
2427                })?;
2428            let codec = tonic::codec::ProstCodec::default();
2429            let path = http::uri::PathAndQuery::from_static(
2430                "/nominal.procedures.v1.ProceduresService/Commit",
2431            );
2432            let mut req = request.into_request();
2433            req.extensions_mut()
2434                .insert(
2435                    GrpcMethod::new("nominal.procedures.v1.ProceduresService", "Commit"),
2436                );
2437            self.inner.unary(req, path, codec).await
2438        }
2439        /// Searches all procedures, returning paged results
2440        pub async fn search_procedures(
2441            &mut self,
2442            request: impl tonic::IntoRequest<super::SearchProceduresRequest>,
2443        ) -> std::result::Result<
2444            tonic::Response<super::SearchProceduresResponse>,
2445            tonic::Status,
2446        > {
2447            self.inner
2448                .ready()
2449                .await
2450                .map_err(|e| {
2451                    tonic::Status::unknown(
2452                        format!("Service was not ready: {}", e.into()),
2453                    )
2454                })?;
2455            let codec = tonic::codec::ProstCodec::default();
2456            let path = http::uri::PathAndQuery::from_static(
2457                "/nominal.procedures.v1.ProceduresService/SearchProcedures",
2458            );
2459            let mut req = request.into_request();
2460            req.extensions_mut()
2461                .insert(
2462                    GrpcMethod::new(
2463                        "nominal.procedures.v1.ProceduresService",
2464                        "SearchProcedures",
2465                    ),
2466                );
2467            self.inner.unary(req, path, codec).await
2468        }
2469        /// Archive procedures
2470        pub async fn archive_procedures(
2471            &mut self,
2472            request: impl tonic::IntoRequest<super::ArchiveProceduresRequest>,
2473        ) -> std::result::Result<
2474            tonic::Response<super::ArchiveProceduresResponse>,
2475            tonic::Status,
2476        > {
2477            self.inner
2478                .ready()
2479                .await
2480                .map_err(|e| {
2481                    tonic::Status::unknown(
2482                        format!("Service was not ready: {}", e.into()),
2483                    )
2484                })?;
2485            let codec = tonic::codec::ProstCodec::default();
2486            let path = http::uri::PathAndQuery::from_static(
2487                "/nominal.procedures.v1.ProceduresService/ArchiveProcedures",
2488            );
2489            let mut req = request.into_request();
2490            req.extensions_mut()
2491                .insert(
2492                    GrpcMethod::new(
2493                        "nominal.procedures.v1.ProceduresService",
2494                        "ArchiveProcedures",
2495                    ),
2496                );
2497            self.inner.unary(req, path, codec).await
2498        }
2499        /// Unarchive procedures
2500        pub async fn unarchive_procedures(
2501            &mut self,
2502            request: impl tonic::IntoRequest<super::UnarchiveProceduresRequest>,
2503        ) -> std::result::Result<
2504            tonic::Response<super::UnarchiveProceduresResponse>,
2505            tonic::Status,
2506        > {
2507            self.inner
2508                .ready()
2509                .await
2510                .map_err(|e| {
2511                    tonic::Status::unknown(
2512                        format!("Service was not ready: {}", e.into()),
2513                    )
2514                })?;
2515            let codec = tonic::codec::ProstCodec::default();
2516            let path = http::uri::PathAndQuery::from_static(
2517                "/nominal.procedures.v1.ProceduresService/UnarchiveProcedures",
2518            );
2519            let mut req = request.into_request();
2520            req.extensions_mut()
2521                .insert(
2522                    GrpcMethod::new(
2523                        "nominal.procedures.v1.ProceduresService",
2524                        "UnarchiveProcedures",
2525                    ),
2526                );
2527            self.inner.unary(req, path, codec).await
2528        }
2529    }
2530}