Add "pretty" subcommand

This commit is contained in:
Joscha 2022-11-20 18:27:25 +01:00
parent 43d5b6d5ae
commit 407786b98c
4 changed files with 74 additions and 1 deletions

40
Cargo.lock generated
View file

@ -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"

View file

@ -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"

View file

@ -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
View 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")
}
}