Add "pretty" subcommand
This commit is contained in:
parent
43d5b6d5ae
commit
407786b98c
4 changed files with 74 additions and 1 deletions
40
Cargo.lock
generated
40
Cargo.lock
generated
|
|
@ -17,6 +17,12 @@ version = "1.0.66"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6"
|
checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "arrayvec"
|
||||||
|
version = "0.5.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "atty"
|
name = "atty"
|
||||||
version = "0.2.14"
|
version = "0.2.14"
|
||||||
|
|
@ -146,6 +152,15 @@ version = "0.2.137"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
|
checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "log"
|
||||||
|
version = "0.4.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
version = "1.16.0"
|
version = "1.16.0"
|
||||||
|
|
@ -158,6 +173,18 @@ version = "6.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7b5bf27447411e9ee3ff51186bf7a08e16c341efdde93f4d823e8844429bed7e"
|
checksum = "7b5bf27447411e9ee3ff51186bf7a08e16c341efdde93f4d823e8844429bed7e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pretty"
|
||||||
|
version = "0.11.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "83f3aa1e3ca87d3b124db7461265ac176b40c277f37e503eaa29c9c75c037846"
|
||||||
|
dependencies = [
|
||||||
|
"arrayvec",
|
||||||
|
"log",
|
||||||
|
"typed-arena",
|
||||||
|
"unicode-segmentation",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro-error"
|
name = "proc-macro-error"
|
||||||
version = "1.0.4"
|
version = "1.0.4"
|
||||||
|
|
@ -230,6 +257,7 @@ dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"chumsky",
|
"chumsky",
|
||||||
"clap",
|
"clap",
|
||||||
|
"pretty",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -250,12 +278,24 @@ dependencies = [
|
||||||
"crunchy",
|
"crunchy",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typed-arena"
|
||||||
|
version = "2.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.5"
|
version = "1.0.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
|
checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-segmentation"
|
||||||
|
version = "1.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "version_check"
|
name = "version_check"
|
||||||
version = "0.9.4"
|
version = "0.9.4"
|
||||||
|
|
|
||||||
|
|
@ -7,3 +7,4 @@ edition = "2021"
|
||||||
anyhow = "1.0.66"
|
anyhow = "1.0.66"
|
||||||
chumsky = "0.8.0"
|
chumsky = "0.8.0"
|
||||||
clap = { version = "4.0.26", features = ["derive", "deprecated"] }
|
clap = { version = "4.0.26", features = ["derive", "deprecated"] }
|
||||||
|
pretty = "0.11.3"
|
||||||
|
|
|
||||||
25
src/main.rs
25
src/main.rs
|
|
@ -1,12 +1,14 @@
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use ::pretty::{Pretty, RcAllocator};
|
||||||
use chumsky::Parser as _;
|
use chumsky::Parser as _;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
|
|
||||||
mod ast;
|
mod ast;
|
||||||
mod builtin;
|
mod builtin;
|
||||||
mod parser;
|
mod parser;
|
||||||
|
mod pretty;
|
||||||
mod span;
|
mod span;
|
||||||
mod table;
|
mod table;
|
||||||
mod value;
|
mod value;
|
||||||
|
|
@ -14,6 +16,7 @@ mod value;
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
enum Command {
|
enum Command {
|
||||||
Parse { file: PathBuf },
|
Parse { file: PathBuf },
|
||||||
|
Pretty { file: PathBuf },
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
|
|
@ -31,7 +34,27 @@ fn main() -> anyhow::Result<()> {
|
||||||
let content = fs::read_to_string(&file)?;
|
let content = fs::read_to_string(&file)?;
|
||||||
let stream = span::stream_from_str(&content);
|
let stream = span::stream_from_str(&content);
|
||||||
match parser::parser().parse(stream) {
|
match parser::parser().parse(stream) {
|
||||||
Ok(lit) => println!("Successful parse: {lit:#?}"),
|
Ok(program) => println!("Successful parse: {program:#?}"),
|
||||||
|
Err(errs) => {
|
||||||
|
println!("Parsing failed");
|
||||||
|
for err in errs {
|
||||||
|
println!("{err:?}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Command::Pretty { file } => {
|
||||||
|
let content = fs::read_to_string(&file)?;
|
||||||
|
let stream = span::stream_from_str(&content);
|
||||||
|
match parser::parser().parse(stream) {
|
||||||
|
Ok(program) => {
|
||||||
|
println!("Successful parse");
|
||||||
|
let doc = program.pretty(&RcAllocator);
|
||||||
|
let mut out = vec![];
|
||||||
|
doc.render(100, &mut out)?;
|
||||||
|
let str = String::from_utf8(out)?;
|
||||||
|
println!("{str}");
|
||||||
|
}
|
||||||
Err(errs) => {
|
Err(errs) => {
|
||||||
println!("Parsing failed");
|
println!("Parsing failed");
|
||||||
for err in errs {
|
for err in errs {
|
||||||
|
|
|
||||||
9
src/pretty.rs
Normal file
9
src/pretty.rs
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
use pretty::{DocAllocator, DocBuilder, Pretty};
|
||||||
|
|
||||||
|
use crate::ast::Program;
|
||||||
|
|
||||||
|
impl<'a, A: DocAllocator<'a>> Pretty<'a, A> for Program {
|
||||||
|
fn pretty(self, allocator: &'a A) -> DocBuilder<'a, A, ()> {
|
||||||
|
allocator.text("Hello world")
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue