diff options
| author | Laurenz <laurmaedje@gmail.com> | 2020-08-02 16:56:14 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2020-08-02 16:56:14 +0200 |
| commit | d5ff97f42ed1e682a66ea8d51e5f9ed1be547b9c (patch) | |
| tree | 2fdc3a368c4320051e3f62a460f3912fe5f44c7c /main | |
| parent | 533374db14087ac54fdc86afa5f009487ac1b850 (diff) | |
Move binary into separate crate and tidy dependencies ðŸŽ
Diffstat (limited to 'main')
| -rw-r--r-- | main/Cargo.toml | 14 | ||||
| -rw-r--r-- | main/main.rs | 60 |
2 files changed, 74 insertions, 0 deletions
diff --git a/main/Cargo.toml b/main/Cargo.toml new file mode 100644 index 00000000..dcb75981 --- /dev/null +++ b/main/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "typstc-main" +version = "0.1.0" +authors = ["The Typst Project Developers"] +edition = "2018" + +[dependencies] +typstc = { path = ".." } +fontdock = { path = "../../fontdock", features = ["fs"] } +futures-executor = "0.3" + +[[bin]] +name = "typstc-main" +path = "main.rs" diff --git a/main/main.rs b/main/main.rs new file mode 100644 index 00000000..a04b163c --- /dev/null +++ b/main/main.rs @@ -0,0 +1,60 @@ +use std::cell::RefCell; +use std::error::Error; +use std::fs::{File, read_to_string}; +use std::io::BufWriter; +use std::path::{Path, PathBuf}; +use std::rc::Rc; +use futures_executor::block_on; + +use fontdock::fs::{FsIndex, FsProvider}; +use fontdock::FontLoader; +use typstc::Typesetter; +use typstc::font::DynProvider; +use typstc::export::pdf; + +fn main() { + if let Err(err) = run() { + eprintln!("error: {}", err); + std::process::exit(1); + } +} + +fn run() -> Result<(), Box<dyn Error>> { + let args: Vec<String> = std::env::args().collect(); + if args.len() < 2 || args.len() > 3 { + println!("Usage: typst src.typ [out.pdf]"); + std::process::exit(0); + } + + let source = Path::new(&args[1]); + let dest = if args.len() <= 2 { + source.with_extension("pdf") + } else { + PathBuf::from(&args[2]) + }; + + if source == dest { + Err("source and destination path are the same")?; + } + + let src = read_to_string(source) + .map_err(|_| "failed to read from source file")?; + + let mut index = FsIndex::new(); + index.search_dir("fonts"); + index.search_os(); + + let (descriptors, files) = index.into_vecs(); + let provider = FsProvider::new(files.clone()); + let dynamic = Box::new(provider) as Box<DynProvider>; + let loader = FontLoader::new(dynamic, descriptors); + let loader = Rc::new(RefCell::new(loader)); + + let typesetter = Typesetter::new(loader.clone()); + let layouts = block_on(typesetter.typeset(&src)).output; + + let writer = BufWriter::new(File::create(&dest)?); + pdf::export(&layouts, &loader, writer)?; + + Ok(()) +} |
