diff --git a/Cargo.toml b/Cargo.toml index 3232e6a05..804fac0e4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,10 +18,18 @@ edition = "2018" name = "sqlparser" path = "src/lib.rs" +[features] +# Enable JSON output in the `cli` example: +json_example = ["serde_json", "serde"] + [dependencies] bigdecimal = { version = "0.1.0", features = ["serde"], optional = true } log = "0.4.5" serde = { version = "1.0", features = ["derive"], optional = true } +# serde_json is only used in examples/cli, but we have to put it outside +# of dev-dependencies because of +# https://github.com/rust-lang/cargo/issues/1596 +serde_json = { version = "1.0", optional = true } [dev-dependencies] simple_logger = "1.0.1" diff --git a/README.md b/README.md index 24674d911..8bf1d4617 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,12 @@ This outputs AST: [Query(Query { ctes: [], body: Select(Select { distinct: false, projection: [UnnamedExpr(Identifier("a")), UnnamedExpr(Identifier("b")), UnnamedExpr(Value(Long(123))), UnnamedExpr(Function(Function { name: ObjectName(["myfunc"]), args: [Identifier("b")], over: None, distinct: false }))], from: [TableWithJoins { relation: Table { name: ObjectName(["table_1"]), alias: None, args: [], with_hints: [] }, joins: [] }], selection: Some(BinaryOp { left: BinaryOp { left: Identifier("a"), op: Gt, right: Identifier("b") }, op: And, right: BinaryOp { left: Identifier("b"), op: Lt, right: Value(Long(100)) } }), group_by: [], having: None }), order_by: [OrderByExpr { expr: Identifier("a"), asc: Some(false) }, OrderByExpr { expr: Identifier("b"), asc: None }], limit: None, offset: None, fetch: None })] ``` +## Command line +To parse a file and dump the results as JSON: +``` +$ cargo run --feature json_example --example cli FILENAME.sql [--dialectname] +``` + ## SQL compliance SQL was first standardized in 1987, and revisions of the standard have been diff --git a/examples/cli.rs b/examples/cli.rs index 2b0822584..f019c520b 100644 --- a/examples/cli.rs +++ b/examples/cli.rs @@ -23,8 +23,16 @@ fn main() { simple_logger::init().unwrap(); let filename = std::env::args().nth(1).expect( - "No arguments provided!\n\n\ - Usage: cargo run --example cli FILENAME.sql [--dialectname]", + r#" +No arguments provided! + +Usage: +$ cargo run --example cli FILENAME.sql [--dialectname] + +To print the parse results as JSON: +$ cargo run --feature json_example --example cli FILENAME.sql [--dialectname] + +"#, ); let dialect: Box = match std::env::args().nth(2).unwrap_or_default().as_ref() { @@ -56,7 +64,17 @@ fn main() { .collect::>() .join("\n") ); - println!("Parse results:\n{:#?}", statements); + + if cfg!(feature = "json_example") { + #[cfg(feature = "json_example")] + { + let serialized = serde_json::to_string_pretty(&statements).unwrap(); + println!("Serialized as JSON:\n{}", serialized); + } + } else { + println!("Parse results:\n{:#?}", statements); + } + std::process::exit(0); } Err(e) => {