use vexy_json::{parse, parse_with_options, Lexer, ParserOptions, Token};
fn debug_string_positions(input: &str) {
println!("\nString positions in: {input:?}");
for (i, ch) in input.chars().enumerate() {
if ch == '"' || ch == '\'' {
println!(" Position {i}: '{ch}'");
}
}
}
fn main() {
let input = r#"{"key": "value"}"#;
let mut lexer = Lexer::new(input);
println!("Tokenizing: {input:?}");
println!("Char positions:");
for (i, ch) in input.chars().enumerate() {
println!(" {i}: '{ch}'");
}
println!("\nTokens:");
loop {
match lexer.next_token_with_span() {
Ok((token, span)) => {
let slice = &input[span.start..span.end];
println!("Token: {token:?}, Span: {span:?}, Slice: {slice:?}");
if token == Token::Eof {
break;
}
}
Err(e) => {
println!("Error: {e:?}");
break;
}
}
}
debug_string_positions(r#"{"key": "value"}"#);
println!("\nParsing object:");
match parse(r#"{"key": "value"}"#) {
Ok(value) => println!("Success: {value:?}"),
Err(e) => println!("Error: {e:?}"),
}
println!("\nParsing number:");
match parse("42") {
Ok(value) => println!("Success: {value:?}"),
Err(e) => println!("Error: {e:?}"),
}
println!("\nParsing float:");
match parse("3.14") {
Ok(value) => println!("Success: {value:?}"),
Err(e) => println!("Error: {e:?}"),
}
println!("\nParsing with strict options:");
let options = ParserOptions {
implicit_top_level: false,
..Default::default()
};
match parse_with_options(r#"{"key": "value"}"#, options) {
Ok(value) => println!("Success: {value:?}"),
Err(e) => println!("Error: {e:?}"),
}
}