Skip to content

Commit 6f56dd2

Browse files
authored
Merge pull request #6 from scileo/master
Add correct whitespaces
2 parents 4e76feb + 6423090 commit 6f56dd2

File tree

1 file changed

+24
-16
lines changed

1 file changed

+24
-16
lines changed

src/reader.rs

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ pub fn try_read_symbol(input: &[u8]) -> IResult<&[u8],Value> {
113113
/// Example Successes:
114114
/// "this is pretty straightforward" => Value::String("this is pretty straightforward")
115115
pub fn try_read_string(input: &[u8]) -> IResult<&[u8],Value> {
116-
named!(quotation,
117-
ws!(tag!("\"")));
116+
named!(quotation, preceded!(consume_clojure_whitespaces, tag!("\"")));
118117
let (rest_input,_) = quotation(input)?;
119118
to_value_parser(
120119
map_res(
@@ -129,10 +128,8 @@ pub fn try_read_string(input: &[u8]) -> IResult<&[u8],Value> {
129128
/// Example Successes:
130129
/// {:a 1} => Value::PersistentListMap {PersistentListMap { MapEntry { :a, 1} .. ]})
131130
pub fn try_read_map(input: &[u8]) -> IResult<&[u8],Value> {
132-
named!(lbracep,
133-
ws!(tag!("{")));
134-
named!(rbracep,
135-
ws!(tag!("}")));
131+
named!(lbracep, preceded!(consume_clojure_whitespaces, tag!("{")));
132+
named!(rbracep, preceded!(consume_clojure_whitespaces, tag!("}")));
136133
let (map_inner_input,_) = lbracep(input)?;
137134
let mut map_as_vec : Vec<MapEntry> = vec![];
138135
let mut rest_input = map_inner_input;
@@ -152,17 +149,15 @@ pub fn try_read_map(input: &[u8]) -> IResult<&[u8],Value> {
152149
}
153150
}
154151

155-
// @TODO remove ws!, use nom functions in place of macro
152+
// @TODO use nom functions in place of macro
156153
/// Tries to parse &[u8] into Value::PersistentVector
157154
/// Example Successes:
158155
/// [1 2 3] => Value::PersistentVector(PersistentVector { vals: [Rc(Value::I32(1) ... ]})
159156
/// [1 2 [5 10 15] 3]
160157
/// => Value::PersistentVector(PersistentVector { vals: [Rc(Value::I32(1) .. Rc(Value::PersistentVector..)]})
161158
pub fn try_read_vector(input: &[u8]) -> IResult<&[u8],Value> {
162-
named!(lbracketp,
163-
ws!(tag!("[")));
164-
named!(rbracketp,
165-
ws!(tag!("]")));
159+
named!(lbracketp, preceded!(consume_clojure_whitespaces, tag!("[")));
160+
named!(rbracketp, preceded!(consume_clojure_whitespaces, tag!("]")));
166161
let (vector_inner_input,_) = lbracketp(input)?;
167162
let mut vector_as_vec = vec![];
168163
// What's left of our input as we read more of our PersistentVector
@@ -196,11 +191,9 @@ pub fn try_read_vector(input: &[u8]) -> IResult<&[u8],Value> {
196191
}
197192

198193
pub fn try_read_list(input: &[u8]) -> IResult<&[u8],Value> {
199-
named!(lparenp,
200-
ws!(tag!("(")));
201-
named!(rparenp,
202-
ws!(tag!(")")));
203-
194+
named!(lparenp, preceded!(consume_clojure_whitespaces, tag!("(")));
195+
named!(rparenp, preceded!(consume_clojure_whitespaces, tag!(")")));
196+
204197
let (list_inner_input,_) = lparenp(input)?;
205198
let mut list_as_vec = vec![];
206199
let mut rest_input = list_inner_input;
@@ -248,3 +241,18 @@ pub fn debug_try_read(input: &[u8]) -> IResult<&[u8], Value> {
248241
reading
249242
}
250243

244+
/// Consumes one or more whitespaces from the input.
245+
///
246+
/// A whitespace is either an ASCII whitespace or a comma.
247+
fn consume_clojure_whitespaces(input: &[u8]) -> IResult<&[u8], ()> {
248+
named!(parser, take_while1!(is_clojure_whitespace));
249+
parser(input).map(|(rest, _)| (rest, ()))
250+
}
251+
252+
/// Returns whether if a given character is a whitespace.
253+
///
254+
/// Clojure defines a whitespace as either a comma or an ASCII whitespace.
255+
fn is_clojure_whitespace(c: u8) -> bool {
256+
// ASCII symbol of `,` is 44.
257+
c.is_ascii_whitespace() || c == 44
258+
}

0 commit comments

Comments
 (0)