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