Skip to content

Commit 361d77b

Browse files
committed
Added case for empty string, refactored a bit, and added tests for
try_read_string
1 parent 182dbb7 commit 361d77b

File tree

1 file changed

+33
-9
lines changed

1 file changed

+33
-9
lines changed

src/reader.rs

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -375,10 +375,7 @@ pub fn try_read_nil(input: &str) -> IResult<&str, Value> {
375375
/// Example Successes:
376376
/// "this is pretty straightforward" => Value::String("this is pretty straightforward")
377377
pub fn try_read_string(input: &str) -> IResult<&str, Value> {
378-
named!(quotation<&str, &str>, preceded!(consume_clojure_whitespaces_parser, tag!("\"")));
379-
380-
let (rest_input, _) = quotation(input)?;
381-
378+
// Convert escaped characters like \n to their actual counterparts -- like an actual newline
382379
named!(escaped_string_parser<&str, String >, escaped_transform!(take_till1!(|ch| { ch == '\\' || ch == '\"'}), '\\', alt!(
383380
tag!("t") => { |_| "\t" } |
384381
tag!("b") => { |_| "\x08" } |
@@ -389,16 +386,18 @@ pub fn try_read_string(input: &str) -> IResult<&str, Value> {
389386
tag!("\"") => { |_| "\"" } |
390387
tag!("\\") => { |_| "\\" }
391388
)));
389+
390+
named!(empty_string_parser <&str, String>, map!(tag!("\"\""),|v| String::from("")));
392391

393392
named!(
394393
string_parser<&str, String>,
395-
map!(
396-
terminated!(escaped_string_parser, tag("\"")),
397-
|v| String::from(v)
398-
)
394+
alt!(
395+
delimited!(tag("\""),escaped_string_parser, tag("\"")) |
396+
// Base case; empty string
397+
empty_string_parser)
399398
);
400399

401-
to_value_parser(string_parser)(rest_input)
400+
to_value_parser(string_parser)(input)
402401
}
403402

404403
pub fn try_read_pattern(input: &str) -> IResult<&str, Value> {
@@ -782,6 +781,31 @@ mod tests {
782781
);
783782
}
784783

784+
785+
#[test]
786+
fn try_read_string_empty() {
787+
assert_eq!(
788+
Value::String(String::from("")),
789+
try_read("\"\"").ok().unwrap().1
790+
);
791+
}
792+
793+
#[test]
794+
fn try_read_string_escaped_quotes() {
795+
assert_eq!(
796+
Value::String(String::from("\" \" c c caf \" fadsg")),
797+
try_read(r#""\" \" c c caf \" fadsg""#).ok().unwrap().1
798+
);
799+
}
800+
801+
#[test]
802+
fn try_read_string_newlines() {
803+
assert_eq!(
804+
Value::String(String::from("\n fadsg \n")),
805+
try_read(r#""\n fadsg \n""#).ok().unwrap().1
806+
);
807+
}
808+
785809
#[test]
786810
fn try_read_int_test() {
787811
assert_eq!(Value::I32(1), try_read("1 ").ok().unwrap().1);

0 commit comments

Comments
 (0)