in components/support/nimbus-cli/src/main.rs [263:418]
fn try_from(cli: &Cli) -> Result<Self> {
let params = NimbusApp::from(cli);
Ok(match cli.command.clone() {
CliCommand::ApplyFile {
file,
preserve_nimbus_db,
open,
} => {
let app = LaunchableApp::try_from(cli)?;
let list = ExperimentListSource::try_from(file.as_path())?;
AppCommand::ApplyFile {
app,
open: open.into(),
list,
preserve_nimbus_db,
}
}
CliCommand::CaptureLogs { file } => {
let app = LaunchableApp::try_from(cli)?;
AppCommand::CaptureLogs { app, file }
}
CliCommand::Defaults {
feature_id,
output,
manifest,
} => {
let manifest = ManifestSource::try_from(¶ms, &manifest)?;
AppCommand::Defaults {
manifest,
feature_id,
output,
}
}
CliCommand::Enroll {
branch,
rollouts,
preserve_targeting,
preserve_bucketing,
preserve_nimbus_db,
experiment,
open,
..
} => {
let app = LaunchableApp::try_from(cli)?;
// Ensure we get the rollouts from the same place we get the experiment from.
let mut recipes: Vec<ExperimentSource> = Vec::new();
for r in rollouts {
let rollout = ExperimentArgs {
experiment: r,
..experiment.clone()
};
recipes.push(ExperimentSource::try_from(&rollout)?);
}
let experiment = ExperimentSource::try_from(cli)?;
Self::Enroll {
app,
params,
experiment,
branch,
rollouts: recipes,
preserve_targeting,
preserve_bucketing,
preserve_nimbus_db,
open: open.into(),
}
}
CliCommand::Features {
manifest,
branch,
feature_id,
output,
validate,
multi,
..
} => {
let manifest = ManifestSource::try_from(¶ms, &manifest)?;
let experiment = ExperimentSource::try_from(cli)?;
AppCommand::ExtractFeatures {
experiment,
branch,
manifest,
feature_id,
validate,
multi,
output,
}
}
CliCommand::Fetch { output, .. } | CliCommand::FetchList { output, .. } => {
let list = ExperimentListSource::try_from(cli)?;
AppCommand::FetchList { list, file: output }
}
CliCommand::Fml { args } => {
let cwd = std::env::current_dir().expect("Current Working Directory is not set");
AppCommand::FmlPassthrough { args, cwd }
}
CliCommand::Info { experiment, output } => AppCommand::Info {
experiment: ExperimentSource::try_from(&experiment)?,
output,
},
CliCommand::List { .. } => {
let list = ExperimentListSource::try_from(cli)?;
AppCommand::List { list }
}
CliCommand::LogState { open } => {
let app = LaunchableApp::try_from(cli)?;
AppCommand::LogState {
app,
open: open.into(),
}
}
CliCommand::Open { open, .. } => {
let app = LaunchableApp::try_from(cli)?;
AppCommand::Open {
app,
open: open.into(),
}
}
#[cfg(feature = "server")]
CliCommand::StartServer => AppCommand::StartServer,
CliCommand::TailLogs => {
let app = LaunchableApp::try_from(cli)?;
AppCommand::TailLogs { app }
}
CliCommand::TestFeature { files, open, .. } => {
let app = LaunchableApp::try_from(cli)?;
let experiment = ExperimentSource::try_from(cli)?;
let first = files
.first()
.ok_or_else(|| anyhow::Error::msg("Need at least one file to make a branch"))?;
let branch = feature_utils::slug(first)?;
Self::Enroll {
app,
params,
experiment,
branch,
rollouts: Default::default(),
open: open.into(),
preserve_targeting: false,
preserve_bucketing: false,
preserve_nimbus_db: false,
}
}
CliCommand::Unenroll { open } => {
let app = LaunchableApp::try_from(cli)?;
AppCommand::Unenroll {
app,
open: open.into(),
}
}
_ => Self::NoOp,
})
}