rust/utils: move common code to a function

Signed-off-by: Rafael Fonseca <r4f4rfs@gmail.com>
This commit is contained in:
Rafael Fonseca 2019-09-28 14:36:02 +02:00 committed by OpenShift Merge Robot
parent 6dab08b646
commit 4d7af0b49b
3 changed files with 37 additions and 54 deletions

View File

@ -17,40 +17,12 @@ use std::io;
use crate::utils;
/// Parse a JSON lockfile definition.
fn lockfile_parse_stream<R: io::Read>(
fmt: utils::InputFormat,
input: &mut R,
) -> Fallible<LockfileConfig> {
let lockfile: LockfileConfig = match fmt {
utils::InputFormat::JSON => {
let lf: LockfileConfig = serde_json::from_reader(input).map_err(|e| {
io::Error::new(
io::ErrorKind::InvalidInput,
format!("serde-json: {}", e.to_string()),
)
})?;
lf
}
utils::InputFormat::YAML => {
let lf: LockfileConfig = serde_yaml::from_reader(input).map_err(|e| {
io::Error::new(
io::ErrorKind::InvalidInput,
format!("serde-yaml: {}", e.to_string()),
)
})?;
lf
}
};
Ok(lockfile)
}
/// Given a lockfile filename, parse it
fn lockfile_parse<P: AsRef<Path>>(filename: P,) -> Fallible<LockfileConfig> {
let filename = filename.as_ref();
let fmt = utils::InputFormat::detect_from_filename(filename)?;
let mut f = io::BufReader::new(utils::open_file(filename)?);
let lf = lockfile_parse_stream(fmt, &mut f).map_err(|e| {
let lf = utils::parse_stream(&fmt, &mut f).map_err(|e| {
io::Error::new(
io::ErrorKind::InvalidInput,
format!("Parsing {}: {}", filename.to_string_lossy(), e.to_string()),
@ -142,7 +114,7 @@ mod tests {
#[test]
fn basic_valid() {
let mut input = io::BufReader::new(VALID_PRELUDE_JS.as_bytes());
let lockfile = lockfile_parse_stream(utils::InputFormat::JSON, &mut input).unwrap();
let lockfile: LockfileConfig = utils::parse_stream(&utils::InputFormat::JSON, &mut input).unwrap();
assert!(lockfile.packages.len() == 2);
}
@ -160,11 +132,11 @@ mod tests {
#[test]
fn basic_valid_override() {
let mut base_input = io::BufReader::new(VALID_PRELUDE_JS.as_bytes());
let mut base_lockfile = lockfile_parse_stream(utils::InputFormat::JSON, &mut base_input).unwrap();
let mut base_lockfile: LockfileConfig = utils::parse_stream(&utils::InputFormat::JSON, &mut base_input).unwrap();
assert!(base_lockfile.packages.len() == 2);
let mut override_input = io::BufReader::new(OVERRIDE_JS.as_bytes());
let override_lockfile = lockfile_parse_stream(utils::InputFormat::JSON, &mut override_input).unwrap();
let override_lockfile: LockfileConfig = utils::parse_stream(&utils::InputFormat::JSON, &mut override_input).unwrap();
assert!(override_lockfile.packages.len() == 1);
base_lockfile.merge(override_lockfile);
@ -176,7 +148,7 @@ mod tests {
#[test]
fn test_invalid() {
let mut input = io::BufReader::new(INVALID_PRELUDE_JS.as_bytes());
match lockfile_parse_stream(utils::InputFormat::JSON, &mut input) {
match utils::parse_stream::<LockfileConfig, _>(&utils::InputFormat::JSON, &mut input) {
Err(ref e) => match e.downcast_ref::<io::Error>() {
Some(ref ioe) if ioe.kind() == io::ErrorKind::InvalidInput => {}
_ => panic!("Expected invalid lockfile, not {}", e.to_string()),

View File

@ -13,7 +13,6 @@ use failure::{Fallible, bail};
use openat;
use serde_derive::{Deserialize, Serialize};
use serde_json;
use serde_yaml;
use std::collections::{HashMap, BTreeMap};
use std::io::prelude::*;
use std::path::Path;
@ -63,26 +62,7 @@ fn treefile_parse_stream<R: io::Read>(
input: &mut R,
basearch: Option<&str>,
) -> Fallible<TreeComposeConfig> {
let mut treefile: TreeComposeConfig = match fmt {
utils::InputFormat::YAML => {
let tf: TreeComposeConfig = serde_yaml::from_reader(input).map_err(|e| {
io::Error::new(
io::ErrorKind::InvalidInput,
format!("serde-yaml: {}", e.to_string()),
)
})?;
tf
}
utils::InputFormat::JSON => {
let tf: TreeComposeConfig = serde_json::from_reader(input).map_err(|e| {
io::Error::new(
io::ErrorKind::InvalidInput,
format!("serde-json: {}", e.to_string()),
)
})?;
tf
}
};
let mut treefile: TreeComposeConfig = utils::parse_stream(&fmt, input)?;
treefile.basearch = match (treefile.basearch, basearch) {
(Some(treearch), Some(arch)) => {

View File

@ -14,6 +14,9 @@ use tempfile;
use curl::easy::Easy;
use serde_json;
use serde_yaml;
#[derive(PartialEq)]
/// Supported config serialization used by treefile and lockfile
pub enum InputFormat {
@ -36,6 +39,34 @@ impl InputFormat {
}
}
/// Given a lockfile/treefile config definition, parse it
pub fn parse_stream<T, R: io::Read>(fmt: &InputFormat, input: &mut R) -> Fallible<T>
where
T: serde::de::DeserializeOwned
{
let parsed: T = match fmt {
InputFormat::JSON => {
let pf: T = serde_json::from_reader(input).map_err(|e| {
io::Error::new(
io::ErrorKind::InvalidInput,
format!("serde-json: {}", e.to_string()),
)
})?;
pf
}
InputFormat::YAML => {
let pf: T = serde_yaml::from_reader(input).map_err(|e| {
io::Error::new(
io::ErrorKind::InvalidInput,
format!("serde-yaml: {}", e.to_string()),
)
})?;
pf
}
};
Ok(parsed)
}
fn download_url_to_tmpfile(url: &str) -> Fallible<fs::File> {
let mut tmpf = tempfile::tempfile()?;
{