Skip to main content

nominal_api/proto/
nominal.procedures.v1.rs

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