Skip to main content

gammaloop_api/commands/
duplicate.rs

1use clap::{Args, Subcommand};
2use color_eyre::Result;
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6use crate::{
7    completion::CompletionArgExt,
8    state::{ProcessRef, State},
9};
10
11#[derive(Subcommand, Debug, Serialize, Deserialize, Clone, JsonSchema, PartialEq)]
12pub enum Duplicate {
13    /// Copy one generated integrand and its process context under new names.
14    Integrand(DuplicateIntegrand),
15}
16
17impl Duplicate {
18    pub fn run(self, state: &mut State) -> Result<()> {
19        match self {
20            Duplicate::Integrand(command) => command.run(state),
21        }
22    }
23}
24
25#[derive(Debug, Args, Serialize, Deserialize, Clone, JsonSchema, PartialEq)]
26pub struct DuplicateIntegrand {
27    /// Source process reference: `#<id>`, `name:<name>`, or `<id>/<name>`
28    #[arg(
29        short = 'p',
30        long = "process",
31        value_name = "PROCESS",
32        completion_process_selector(crate::completion::SelectorKind::Any)
33    )]
34    pub process: Option<ProcessRef>,
35
36    /// Source integrand name
37    #[arg(
38        short = 'i',
39        long = "integrand-name",
40        value_name = "NAME",
41        completion_integrand_selector(crate::completion::SelectorKind::Any)
42    )]
43    pub integrand_name: Option<String>,
44
45    /// Destination process name
46    #[arg(long = "output_process_name", value_name = "NAME")]
47    pub output_process_name: String,
48
49    /// Destination integrand name
50    #[arg(long = "output_integrand_name", value_name = "NAME")]
51    pub output_integrand_name: String,
52}
53
54impl DuplicateIntegrand {
55    pub fn run(self, state: &mut State) -> Result<()> {
56        state.duplicate_integrand(
57            self.process.as_ref(),
58            self.integrand_name.as_ref(),
59            &self.output_process_name,
60            &self.output_integrand_name,
61        )
62    }
63}