leo/compiler/parser/examples/parser.rs
2022-06-06 11:00:08 -07:00

76 lines
2.4 KiB
Rust

// Copyright (C) 2019-2022 Aleo Systems Inc.
// This file is part of the Leo library.
// The Leo library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// The Leo library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
use leo_ast::Ast;
use leo_errors::emitter::Handler;
use leo_span::symbol::create_session_if_not_set_then;
use clap::StructOpt;
use std::{
fs,
path::{Path, PathBuf},
};
#[derive(Debug, StructOpt)]
#[structopt(name = "leo parser", about = "Parse Leo AST and store it as a JSON")]
struct Opt {
/// Path to the Leo file.
#[structopt(parse(from_os_str))]
input_path: PathBuf,
/// Optional path to the output directory.
#[structopt(parse(from_os_str))]
out_dir_path: Option<PathBuf>,
/// Whether to print result to STDOUT.
#[structopt(short, long)]
print_stdout: bool,
}
fn main() -> Result<(), String> {
let opt = Opt::parse();
// Parses the Leo file constructing an ast which is then serialized.
let serialized_leo_tree = create_session_if_not_set_then(|s| {
let code = s.source_map.load_file(&opt.input_path).expect("failed to open file");
Handler::with(|h| {
let ast = leo_parser::parse_ast(h, &code.src, code.start_pos)?;
let json = Ast::to_json_string(&ast)?;
println!("{}", json);
Ok(json)
})
.map_err(|b| b.to_string())
})?;
if opt.print_stdout {
println!("{}", serialized_leo_tree);
}
let out_path = if let Some(out_dir) = opt.out_dir_path {
format!(
"{}/{}.json",
out_dir.as_path().display(),
opt.input_path.file_stem().unwrap().to_str().unwrap()
)
} else {
format!("./{}.json", opt.input_path.file_stem().unwrap().to_str().unwrap())
};
fs::write(Path::new(&out_path), serialized_leo_tree).expect("failed to write output");
Ok(())
}