use crate::store::{get_store, Store};
use crate::Error;
use crate::Project;
use crate::Service;
use crate::StageContext;
use clap::ArgMatches;
use std::fs::File;
use std::io::prelude::*;
use std::sync::Arc;
use tracing::{debug, instrument};
#[instrument(skip(subcommand))]
pub fn get(project_path: &str, subcommand: &ArgMatches) -> Result<(), Error> {
debug!("Retrieve parameter value");
let project = Project::from_path(project_path)?;
let param_name = subcommand.value_of("name").unwrap();
if !param_name.contains(':') {
if let Some(context) = StageContext::from_env() {
let stage = project
.stages
.get(&context.stage)
.expect("stage missing in project file");
if let Some(value) = stage.params.get(param_name) {
print!("{}", value);
return Ok(());
}
}
if let Some(global) = &project.global {
if let Some(value) = global.params.get(param_name) {
print!("{}", value);
return Ok(());
}
}
}
if !can_get(project.clone(), param_name) {
return Err(Error::GetParameterError(
"permission denied to get the parameter",
param_name.to_string(),
));
}
let store = get_store(project)?;
print!("{}", store.get(param_name)?);
Ok(())
}
#[instrument(skip(subcommand))]
pub fn get_file(project_path: &str, subcommand: &ArgMatches) -> Result<(), Error> {
debug!("Retrieve parameter value file");
let project = Project::from_path(project_path)?;
let param_name = subcommand.value_of("name").unwrap();
let filename = subcommand.value_of("filename").unwrap();
if !can_get(project.clone(), param_name) {
return Err(Error::GetParameterError(
"permission denied to get the parameter",
param_name.to_string(),
));
}
let store = get_store(project)?;
let data = store.get_bytes(param_name)?;
let mut file = File::create(filename)?;
file.write_all(&data)?;
Ok(())
}
fn can_get(project: Arc<Project>, param_name: &str) -> bool {
if !param_name.contains(':') {
return true;
}
let dep_name = param_name.split(':').collect::<Vec<&str>>()[0];
let context = match StageContext::from_env() {
Some(context) => context,
None => return true,
};
let service = Service::from_name(project, &context.service).unwrap();
let deps = service.depends_on(&context.stage);
deps.contains(&dep_name.to_string())
}