core/vec: trim parts before parsing

This commit is contained in:
Dmitriy Pleshevskiy 2022-07-22 18:39:29 +03:00
parent 71d6fe42e8
commit 332b14bcd9
Signed by: pleshevskiy
GPG key ID: 1B59187B161C0215
3 changed files with 66 additions and 7 deletions

15
examples/calc.rs Normal file
View file

@ -0,0 +1,15 @@
use enve::core::SepVec;
type PlusVec<T> = SepVec<T, '+'>;
type MulVec<T> = SepVec<T, '*'>;
fn main() -> Result<(), enve::Error> {
let res: f32 = enve::get::<PlusVec<MulVec<f32>>>("E")?
.iter()
.map(|m| m.iter().product::<f32>())
.sum();
println!("result: {}", res);
Ok(())
}

View file

@ -51,6 +51,7 @@ where
fn try_from(value: EString) -> Result<Self, Self::Error> { fn try_from(value: EString) -> Result<Self, Self::Error> {
let inner = value let inner = value
.split(SEP) .split(SEP)
.map(|p| p.trim())
.map(EString::from) .map(EString::from)
.map(T::try_from) .map(T::try_from)
.collect::<Result<Vec<_>, _>>()?; .collect::<Result<Vec<_>, _>>()?;

View file

@ -91,9 +91,19 @@ mod tests {
use super::*; use super::*;
#[test] #[test]
fn should_throw_parse_error() { fn should_return_parsed_num() {
let en = TestCase::<4>.to_string(); let en = TestCase::<4>.to_string();
env::set_var(&en, "-10"); env::set_var(&en, "-10");
match get::<i32>(&en) {
Ok(res) => assert_eq!(res, -10),
_ => unreachable!(),
};
}
#[test]
fn should_throw_parse_error() {
let en = TestCase::<5>.to_string();
env::set_var(&en, "-10");
match get::<u32>(&en) { match get::<u32>(&en) {
Err(Error::Parse(orig)) => { Err(Error::Parse(orig)) => {
assert_eq!(orig, String::from("-10")) assert_eq!(orig, String::from("-10"))
@ -104,7 +114,7 @@ mod tests {
#[test] #[test]
fn should_set_default_num_if_var_is_no_present() { fn should_set_default_num_if_var_is_no_present() {
let en = TestCase::<5>.to_string(); let en = TestCase::<6>.to_string();
let orig = 10; let orig = 10;
match get_or_set_default(&en, orig) { match get_or_set_default(&en, orig) {
Ok(res) => { Ok(res) => {
@ -122,7 +132,7 @@ mod tests {
#[test] #[test]
fn should_parse_bool_variable() { fn should_parse_bool_variable() {
let en = TestCase::<5>.to_string(); let en = TestCase::<7>.to_string();
[ [
("y", true), ("y", true),
@ -150,11 +160,11 @@ mod tests {
#[cfg(feature = "vec")] #[cfg(feature = "vec")]
mod vector { mod vector {
use super::*; use super::*;
use crate::core::vec::{CommaVec, SepVec}; use crate::core::vec::{CommaVec, SemiVec, SepVec};
#[test] #[test]
fn should_return_var_as_vector() { fn should_return_var_as_vector() {
let en = TestCase::<6>.to_string(); let en = TestCase::<8>.to_string();
env::set_var(&en, "1,2,3,4,5"); env::set_var(&en, "1,2,3,4,5");
match get::<CommaVec<i32>>(&en) { match get::<CommaVec<i32>>(&en) {
@ -163,9 +173,42 @@ mod tests {
}; };
} }
#[test]
fn should_trim_identations_before_parsing() {
let en = TestCase::<9>.to_string();
let input = "
1 , 2, 3,
4,5";
env::set_var(&en, input);
match get::<CommaVec<i32>>(&en) {
Ok(res) => assert_eq!(*res, vec![1, 2, 3, 4, 5]),
_ => unreachable!(),
};
}
#[test]
fn should_return_vector_of_vectors() {
let en = TestCase::<10>.to_string();
env::set_var(&en, "1,2; 3,4,5; 6,7");
match get::<SemiVec<CommaVec<i32>>>(&en) {
Ok(res) => assert_eq!(
res,
SemiVec::from(vec![
CommaVec::from(vec![1, 2]),
CommaVec::from(vec![3, 4, 5]),
CommaVec::from(vec![6, 7])
])
),
_ => unreachable!(),
};
}
#[test] #[test]
fn should_throw_parse_vec_error() { fn should_throw_parse_vec_error() {
let en = TestCase::<7>.to_string(); let en = TestCase::<11>.to_string();
env::set_var(&en, "1,2,3,4,5"); env::set_var(&en, "1,2,3,4,5");
match get::<SepVec<i32, '+'>>(&en) { match get::<SepVec<i32, '+'>>(&en) {
Err(Error::Parse(orig)) => { Err(Error::Parse(orig)) => {
@ -177,7 +220,7 @@ mod tests {
#[test] #[test]
fn should_set_default_vector_if_var_is_no_present() { fn should_set_default_vector_if_var_is_no_present() {
let en = TestCase::<8>.to_string(); let en = TestCase::<12>.to_string();
let orig = CommaVec::from(vec![1, 2, 3, 4]); let orig = CommaVec::from(vec![1, 2, 3, 4]);
match get_or_set_default(&en, orig.clone()) { match get_or_set_default(&en, orig.clone()) {
Ok(res) => { Ok(res) => {