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