Skip to content

Commit

Permalink
#5 variables are read from environment and propagated
Browse files Browse the repository at this point in the history
  • Loading branch information
anatoly-scherbakov committed Jun 22, 2020
1 parent cbb5bd5 commit 6187a75
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 5 deletions.
13 changes: 11 additions & 2 deletions src/config.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::fs;
use std::ffi::OsString;
use serde::Deserialize;
use std::collections::BTreeMap;
use std::collections::{BTreeMap, HashMap};
use csv::StringRecord;

use crate::transformer::{Transformer, Expression};
Expand Down Expand Up @@ -60,6 +60,7 @@ fn get_input_columns_index_map(headers: &StringRecord) -> BTreeMap<String, usize
fn step_to_expression(
step: &Step,
input_column_index_by_name: &BTreeMap<String, usize>,
variables: &HashMap<String, String>,
) -> Result<Option<Expression>, String> {
match step {
Step::Input {input} => match input_column_index_by_name.get(input) {
Expand Down Expand Up @@ -88,6 +89,7 @@ fn step_to_expression(
fn column_to_expressions(
column: &Column,
input_column_index_by_name: &BTreeMap<String, usize>,
variables: &HashMap<String, String>,
) -> Result<Vec<Expression>, String> {
match column {
Column::Input(input_column_name) => {
Expand All @@ -96,6 +98,7 @@ fn column_to_expressions(
input: input_column_name.clone(),
},
&input_column_index_by_name,
&variables,
);

match maybe_some_expression? {
Expand All @@ -109,6 +112,7 @@ fn column_to_expressions(
|step| step_to_expression(
step,
&input_column_index_by_name,
&variables,
),
).collect();

Expand All @@ -118,13 +122,18 @@ fn column_to_expressions(
}


pub fn create_transformer(config: &Config, headers: &StringRecord) -> Result<Transformer, String> {
pub fn create_transformer(
config: &Config,
headers: &StringRecord,
variables: &HashMap<String, String>,
) -> Result<Transformer, String> {
let input_columns_index_by_name = get_input_columns_index_map(headers);

let maybe_columns: Result<Vec<Vec<Expression>>, String> = config.columns.values().map(
|column| column_to_expressions(
column,
&input_columns_index_by_name,
&variables,
),
).collect();

Expand Down
18 changes: 17 additions & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ use worker::process;
use config::parse_config_from_file;
use serde::Serialize;
use crate::printable_error::PrintableError;
use std::collections::HashMap;


const HELP: &str = r#"
Expand Down Expand Up @@ -46,10 +47,25 @@ fn format_error(error: &PrintableError, format: &ErrorFormat) -> String {
}
}

// Fetch environment variables
fn determine_variables() -> HashMap<String, String> {
let prefix = "YSV_VAR_";

env::vars().filter(
|(variable, value)| variable.starts_with(prefix)
).map(
|(variable, value)| (
variable.replace(prefix, ""),
value,
)
).collect()
}


fn run(file_path: &str) -> Result<(), PrintableError> {
let variables = determine_variables();
let config = parse_config_from_file(file_path)?;
process(config);
process(config, variables);
Ok(())
}

Expand Down
5 changes: 3 additions & 2 deletions src/worker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use csv::{ByteRecord, Reader, Writer, ReaderBuilder};

use crate::config::{Config, create_transformer};
use crate::transformer::{Transformer, Expression};
use std::collections::HashMap;


fn apply_column(column: &Vec<Expression>, record: &ByteRecord) -> String {
Expand Down Expand Up @@ -31,7 +32,7 @@ fn transform(record: ByteRecord, transformer: &Transformer) -> ByteRecord {
}


pub fn process(config: Config) -> Result<(), String> {
pub fn process(config: Config, variables: HashMap<String, String>) -> Result<(), String> {
let mut reader = ReaderBuilder::new()
.flexible(true)
.from_reader(io::stdin());
Expand All @@ -40,7 +41,7 @@ pub fn process(config: Config) -> Result<(), String> {

let headers = reader.headers().unwrap().clone();

let transformer = create_transformer(&config, &headers)?;
let transformer = create_transformer(&config, &headers, &variables)?;

writer.write_record(&transformer.headers).unwrap();

Expand Down

0 comments on commit 6187a75

Please sign in to comment.