@@ -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")
115115pub 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} .. ]})
131130pub 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..)]})
161158pub 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
198193pub 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