parent
f54b99984e
commit
0124b34486
15 changed files with 69 additions and 93 deletions
11
Cargo.toml
11
Cargo.toml
|
@ -17,12 +17,9 @@ all-features = true
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[features]
|
||||
prim = ["number", "bool"]
|
||||
number = []
|
||||
bool = []
|
||||
vec = []
|
||||
tuple = []
|
||||
low-level = []
|
||||
aggs = []
|
||||
structs = []
|
||||
|
||||
[dependencies]
|
||||
|
||||
|
@ -31,8 +28,8 @@ maintenance = { status = "actively-developed" }
|
|||
|
||||
[[example]]
|
||||
name = "calc"
|
||||
required-features = ["vec", "number"]
|
||||
required-features = ["structs"]
|
||||
|
||||
[[example]]
|
||||
name = "dotenv"
|
||||
required-features = ["vec", "tuple", "low-level"]
|
||||
required-features = ["structs", "low-level"]
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use estring::{EString, SepVec};
|
||||
use estring::structs::SepVec;
|
||||
use estring::EString;
|
||||
|
||||
type PlusVec<T> = SepVec<T, '+'>;
|
||||
type MulVec<T> = SepVec<T, '*'>;
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
use estring::{EString, Pair, SepVec, Trim};
|
||||
use estring::low::Trim;
|
||||
use estring::structs::{Pair, SepVec};
|
||||
use estring::EString;
|
||||
|
||||
const DOTENV_CONTENT: &str = "
|
||||
DATABASE_URL=postgres://user:password@localhost:5432/recipes
|
||||
|
|
2
src/agg.rs
Normal file
2
src/agg.rs
Normal file
|
@ -0,0 +1,2 @@
|
|||
//! This module will contain aggregate functions (Sum, Product, etc)
|
||||
//!
|
19
src/core.rs
19
src/core.rs
|
@ -1,25 +1,6 @@
|
|||
//! Contains the ``EString`` type, as well as the basic implementation of conversions to
|
||||
//! string types
|
||||
//!
|
||||
#[cfg(any(feature = "number", feature = "bool"))]
|
||||
pub mod prim;
|
||||
#[cfg(any(feature = "number", feature = "bool"))]
|
||||
pub use prim::*;
|
||||
|
||||
#[cfg(feature = "vec")]
|
||||
pub mod vec;
|
||||
#[cfg(feature = "vec")]
|
||||
pub use vec::*;
|
||||
|
||||
#[cfg(feature = "tuple")]
|
||||
pub mod tuple;
|
||||
#[cfg(feature = "tuple")]
|
||||
pub use tuple::*;
|
||||
|
||||
#[cfg(feature = "low-level")]
|
||||
pub mod low;
|
||||
#[cfg(feature = "low-level")]
|
||||
pub use low::*;
|
||||
|
||||
use crate::ParseError;
|
||||
use std::convert::Infallible;
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
//! Contains the implementations to primitive types (number, boolean)
|
||||
//!
|
||||
//! **NOTE**: Require the enabling of the same-name features
|
||||
//!
|
||||
|
||||
#[cfg(feature = "bool")]
|
||||
mod bool;
|
||||
#[cfg(feature = "bool")]
|
||||
pub use self::bool::*;
|
||||
|
||||
#[cfg(feature = "number")]
|
||||
mod number;
|
||||
#[cfg(feature = "number")]
|
||||
pub use self::number::*;
|
11
src/lib.rs
11
src/lib.rs
|
@ -31,8 +31,17 @@
|
|||
#![allow(clippy::module_name_repetitions)]
|
||||
#![warn(missing_docs)]
|
||||
|
||||
pub mod core;
|
||||
mod error;
|
||||
|
||||
pub mod core;
|
||||
pub mod std;
|
||||
|
||||
#[cfg(feature = "aggs")]
|
||||
pub mod agg;
|
||||
#[cfg(feature = "low-level")]
|
||||
pub mod low;
|
||||
#[cfg(feature = "structs")]
|
||||
pub mod structs;
|
||||
|
||||
pub use crate::core::*;
|
||||
pub use crate::error::ParseError;
|
||||
|
|
|
@ -1,9 +1,5 @@
|
|||
use crate::core::EString;
|
||||
|
||||
//===========================================================================//
|
||||
// TRIM //
|
||||
//===========================================================================//
|
||||
|
||||
/// Wrapper that allow to trim substring before continue
|
||||
///
|
||||
/// **NOTE**: Required the enabling of the `low-level` feature.
|
8
src/std.rs
Normal file
8
src/std.rs
Normal file
|
@ -0,0 +1,8 @@
|
|||
//! Contains implementations for standard types (`bool`, numbers, `Option`, etc.)
|
||||
//!
|
||||
|
||||
mod bool;
|
||||
mod number;
|
||||
|
||||
pub use self::bool::*;
|
||||
pub use number::*;
|
|
@ -4,7 +4,6 @@ use crate::core::EString;
|
|||
macro_rules! from_env_string_numbers_impl {
|
||||
($($ty:ty),+$(,)?) => {
|
||||
$(
|
||||
#[cfg(feature = "number")]
|
||||
impl TryFrom<EString> for $ty {
|
||||
type Error = <$ty as std::str::FromStr>::Err;
|
||||
|
10
src/structs.rs
Normal file
10
src/structs.rs
Normal file
|
@ -0,0 +1,10 @@
|
|||
//! Contains the predefined types (``SepVec``, ``Pair``, etc.)
|
||||
//!
|
||||
//! **NOTE**: Require the enabling the `structs` feature.
|
||||
//!
|
||||
|
||||
mod pair;
|
||||
mod sep_vec;
|
||||
|
||||
pub use pair::*;
|
||||
pub use sep_vec::*;
|
|
@ -1,6 +1,4 @@
|
|||
//! Contains the implementations to tuple type
|
||||
//!
|
||||
//! **NOTE**: Require the enabling of the `tuple` features
|
||||
//! Contains the implementations to pair tuple type
|
||||
//!
|
||||
|
||||
use crate::core::EString;
|
||||
|
@ -87,6 +85,7 @@ where
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::structs::SepVec;
|
||||
|
||||
type EqPair<A, B> = Pair<A, '=', B>;
|
||||
|
||||
|
@ -108,24 +107,17 @@ mod tests {
|
|||
};
|
||||
}
|
||||
|
||||
#[cfg(feature = "number")]
|
||||
mod vec {
|
||||
use crate::SepVec;
|
||||
type LineVec<T> = SepVec<T, '\n'>;
|
||||
|
||||
use super::*;
|
||||
|
||||
type LineVec<T> = SepVec<T, '\n'>;
|
||||
|
||||
#[test]
|
||||
fn should_parse_vec_of_pairs() {
|
||||
let estr = EString::from(
|
||||
"foo=bar
|
||||
#[test]
|
||||
fn should_parse_vec_of_pairs() {
|
||||
let estr = EString::from(
|
||||
"foo=bar
|
||||
hello=bar",
|
||||
);
|
||||
match estr.parse::<LineVec<EqPair<&str, &str>>>() {
|
||||
Ok(res) => assert_eq!(res, SepVec(vec![Pair("foo", "bar"), Pair("hello", "bar"),])),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
}
|
||||
);
|
||||
match estr.parse::<LineVec<EqPair<&str, &str>>>() {
|
||||
Ok(res) => assert_eq!(res, SepVec(vec![Pair("foo", "bar"), Pair("hello", "bar"),])),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
}
|
||||
}
|
|
@ -1,7 +1,5 @@
|
|||
//! Contains the implementations to vec type
|
||||
//!
|
||||
//! **NOTE**: Require the enabling of the `vec` features
|
||||
//!
|
||||
|
||||
use crate::core::EString;
|
||||
use std::fmt::Write;
|
||||
|
@ -78,6 +76,7 @@ where
|
|||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::ParseError;
|
||||
|
||||
const COMMA: char = ',';
|
||||
const SEMI: char = ';';
|
||||
|
@ -122,29 +121,23 @@ d,e";
|
|||
};
|
||||
}
|
||||
|
||||
#[cfg(feature = "number")]
|
||||
mod numbers {
|
||||
use super::*;
|
||||
use crate::ParseError;
|
||||
#[test]
|
||||
fn should_parse_into_num_vec() {
|
||||
let estr = EString::from("1,2,3,4,5");
|
||||
match estr.parse::<CommaVec<i32>>() {
|
||||
Ok(res) => assert_eq!(*res, vec![1, 2, 3, 4, 5]),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_parse_into_num_vec() {
|
||||
let estr = EString::from("1,2,3,4,5");
|
||||
match estr.parse::<CommaVec<i32>>() {
|
||||
Ok(res) => assert_eq!(*res, vec![1, 2, 3, 4, 5]),
|
||||
_ => unreachable!(),
|
||||
};
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_throw_parse_vec_error() {
|
||||
let estr = EString::from("1,2,3,4,5");
|
||||
match estr.parse::<SemiVec<i32>>() {
|
||||
Err(ParseError(orig)) => {
|
||||
assert_eq!(orig, String::from("1,2,3,4,5"));
|
||||
}
|
||||
_ => unreachable!(),
|
||||
};
|
||||
}
|
||||
#[test]
|
||||
fn should_throw_parse_vec_error() {
|
||||
let estr = EString::from("1,2,3,4,5");
|
||||
match estr.parse::<SemiVec<i32>>() {
|
||||
Err(ParseError(orig)) => {
|
||||
assert_eq!(orig, String::from("1,2,3,4,5"));
|
||||
}
|
||||
_ => unreachable!(),
|
||||
};
|
||||
}
|
||||
}
|
Reference in a new issue