Skip to content

Commit

Permalink
fix: compile errors
Browse files Browse the repository at this point in the history
  • Loading branch information
Myriad-Dreamin committed Dec 28, 2023
1 parent faefbfa commit 181c54b
Show file tree
Hide file tree
Showing 11 changed files with 194 additions and 79 deletions.
12 changes: 12 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

68 changes: 68 additions & 0 deletions crates/mitex-cli/src/generate.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
use serde::{Deserialize, Serialize};

pub fn generate() {
// typst query --root . .\packages\latex-spec\mod.typ "<mitex-packages>"
let project_root = std::env::var("CARGO_MANIFEST_DIR").unwrap();
let project_root = std::path::Path::new(&project_root)
.parent()
.unwrap()
.parent()
.unwrap();

let target_dir = project_root.join("target/mitex-artifacts");

let package_specs = std::process::Command::new("typst")
.args([
"query",
"--root",
project_root.to_str().unwrap(),
project_root
.join("packages/mitex/specs/mod.typ")
.to_str()
.unwrap(),
"<mitex-packages>",
])
.output()
.expect("failed to query metadata");

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
struct QueryItem<T> {
pub value: T,
}

type Json<T> = Vec<QueryItem<T>>;

let mut json_spec: mitex_spec::JsonCommandSpec = Default::default();
let json_packages: Json<mitex_spec::query::PackagesVec> =
serde_json::from_slice(&package_specs.stdout).expect("failed to parse package specs");
if json_packages.is_empty() {
panic!("no package found");
}
if json_packages.len() > 1 {
panic!("multiple packages found");
}

std::fs::create_dir_all(target_dir.join("spec")).unwrap();

let json_packages = json_packages.into_iter().next().unwrap().value;
std::fs::write(
target_dir.join("spec/packages.json"),
serde_json::to_string_pretty(&json_packages).unwrap(),
)
.unwrap();

for package in json_packages.0 {
for (name, item) in package.spec.commands {
json_spec.commands.insert(name, item);
}
}
std::fs::write(
target_dir.join("spec/default.json"),
serde_json::to_string_pretty(&json_spec).unwrap(),
)
.unwrap();

let spec: mitex_spec::CommandSpec = json_spec.into();

std::fs::write(target_dir.join("spec/default.rkyv"), spec.to_bytes()).unwrap();
}
80 changes: 8 additions & 72 deletions crates/mitex-cli/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
use std::path::Path;

use anyhow::Context;
use serde::{Deserialize, Serialize};

mod generate;
use generate::generate;

const HELP: &str = r#"usage: mitex <command> [args...]
Expand Down Expand Up @@ -29,7 +31,10 @@ fn main() -> anyhow::Result<()> {
return Ok(());
}
match args.get(1).map(|s| s.as_str()) {
None | Some("generate") => generate(),
None | Some("generate") => {
generate();
Ok(())
}
Some("compile") | Some("syntax") => {
let is_ast = args[1] == "syntax";
let input_path = args.get(2).expect("missing input path");
Expand All @@ -44,81 +49,12 @@ fn main() -> anyhow::Result<()> {
}
}

fn generate() -> anyhow::Result<()> {
// typst query --root . .\packages\latex-spec\mod.typ "<mitex-packages>"
let project_root = std::env::var("CARGO_MANIFEST_DIR").unwrap();
let project_root = std::path::Path::new(&project_root)
.parent()
.unwrap()
.parent()
.unwrap();

let target_dir = project_root.join("target/mitex-artifacts");

let package_specs = std::process::Command::new("typst")
.args([
"query",
"--root",
project_root.to_str().unwrap(),
project_root
.join("packages/mitex/specs/mod.typ")
.to_str()
.unwrap(),
"<mitex-packages>",
])
.output()
.expect("failed to query metadata");

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
struct QueryItem<T> {
pub value: T,
}

type Json<T> = Vec<QueryItem<T>>;

let mut json_spec: mitex_spec::JsonCommandSpec = Default::default();
let json_packages: Json<mitex_spec::query::PackagesVec> =
serde_json::from_slice(&package_specs.stdout).expect("failed to parse package specs");
if json_packages.is_empty() {
panic!("no package found");
}
if json_packages.len() > 1 {
panic!("multiple packages found");
}

std::fs::create_dir_all(target_dir.join("spec")).unwrap();

let json_packages = json_packages.into_iter().next().unwrap().value;
std::fs::write(
target_dir.join("spec/packages.json"),
serde_json::to_string_pretty(&json_packages).unwrap(),
)
.unwrap();

for package in json_packages.0 {
for (name, item) in package.spec.commands {
json_spec.commands.insert(name, item);
}
}
std::fs::write(
target_dir.join("spec/default.json"),
serde_json::to_string_pretty(&json_spec).unwrap(),
)
.unwrap();

let spec: mitex_spec::CommandSpec = json_spec.into();

std::fs::write(target_dir.join("spec/default.rkyv"), spec.to_bytes()).unwrap();

Ok(())
}

fn compile(input_path: &str, output_path: &str, is_ast: bool) -> anyhow::Result<()> {
let input = std::fs::read_to_string(input_path)
.with_context(|| format!("failed to read input file: {input_path}"))?;

let output = if !is_ast {
mitex::convert_text(&input, None).map_err(|e| anyhow::anyhow!("{}", e))
mitex::convert_math(&input, None).map_err(|e| anyhow::anyhow!("{}", e))
} else {
Ok(format!(
"{:#?}",
Expand Down
2 changes: 2 additions & 0 deletions crates/mitex-lexer/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ fxhash.workspace = true
once_cell.workspace = true

[dev-dependencies]
mitex-spec-gen = { path = "../mitex-spec-gen" }

insta.workspace = true
divan.workspace = true

Expand Down
9 changes: 6 additions & 3 deletions crates/mitex-parser/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,12 @@ mitex-spec = { path = "../mitex-spec" }
rowan.workspace = true

[dev-dependencies]
once_cell = "1"
insta = "1.34"
divan = "0.1.7"

mitex-spec-gen = { path = "../mitex-spec-gen" }

once_cell.workspace = true
insta.workspace = true
divan.workspace = true

[lints]
workspace = true
17 changes: 17 additions & 0 deletions crates/mitex-spec-gen/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[package]
name = "mitex-spec-gen"
description = "Guard to geneate specification files for dependent crates"
authors.workspace = true
version.workspace = true
license.workspace = true
edition.workspace = true
homepage.workspace = true
repository.workspace = true

[build-dependencies]
mitex-spec = { path = "../mitex-spec" }
serde.workspace = true
serde_json.workspace = true

[lints]
workspace = true
74 changes: 74 additions & 0 deletions crates/mitex-spec-gen/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
use serde::{Deserialize, Serialize};

fn main() {
// require rustc 1.70.0
println!("cargo:rerun-if-changed=ALWAYS_RUN_ME");
generate();
}

fn generate() {
// typst query --root . .\packages\latex-spec\mod.typ "<mitex-packages>"
let project_root = std::env::var("CARGO_MANIFEST_DIR").unwrap();
let project_root = std::path::Path::new(&project_root)
.parent()
.unwrap()
.parent()
.unwrap();

let target_dir = project_root.join("target/mitex-artifacts");

let package_specs = std::process::Command::new("typst")
.args([
"query",
"--root",
project_root.to_str().unwrap(),
project_root
.join("packages/mitex/specs/mod.typ")
.to_str()
.unwrap(),
"<mitex-packages>",
])
.output()
.expect("failed to query metadata");

#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
struct QueryItem<T> {
pub value: T,
}

type Json<T> = Vec<QueryItem<T>>;

let mut json_spec: mitex_spec::JsonCommandSpec = Default::default();
let json_packages: Json<mitex_spec::query::PackagesVec> =
serde_json::from_slice(&package_specs.stdout).expect("failed to parse package specs");
if json_packages.is_empty() {
panic!("no package found");
}
if json_packages.len() > 1 {
panic!("multiple packages found");
}

std::fs::create_dir_all(target_dir.join("spec")).unwrap();

let json_packages = json_packages.into_iter().next().unwrap().value;
std::fs::write(
target_dir.join("spec/packages.json"),
serde_json::to_string_pretty(&json_packages).unwrap(),
)
.unwrap();

for package in json_packages.0 {
for (name, item) in package.spec.commands {
json_spec.commands.insert(name, item);
}
}
std::fs::write(
target_dir.join("spec/default.json"),
serde_json::to_string_pretty(&json_spec).unwrap(),
)
.unwrap();

let spec: mitex_spec::CommandSpec = json_spec.into();

std::fs::write(target_dir.join("spec/default.rkyv"), spec.to_bytes()).unwrap();
}
1 change: 1 addition & 0 deletions crates/mitex-spec-gen/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

1 change: 1 addition & 0 deletions crates/mitex/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ harness = false
[dependencies]

mitex-parser = { path = "../mitex-parser" }
mitex-spec-gen = { path = "../mitex-spec-gen" }
rowan.workspace = true
bitflags = "2.4.1"
once_cell.workspace = true
Expand Down
8 changes: 5 additions & 3 deletions scripts/build.ps1
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
cargo run --release --bin mitex-cli
cargo build --release --target wasm32-unknown-unknown -p mitex-typst
rm packages/mitex/mitex.wasm -Force
mv target/wasm32-unknown-unknown/release/mitex_typst.wasm packages/mitex/mitex.wasm
$InstallPath = "packages/mitex/mitex.wasm"
if (Test-Path $InstallPath) {
Remove-Item $InstallPath
}
mv target/wasm32-unknown-unknown/release/mitex_typst.wasm $InstallPath
1 change: 0 additions & 1 deletion scripts/build.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#!/usr/bin/env bash
cargo run --release --bin mitex-cli
cargo build --release --target wasm32-unknown-unknown -p mitex-typst
rm -f packages/mitex/mitex.wasm
mv target/wasm32-unknown-unknown/release/mitex_typst.wasm packages/mitex/mitex.wasm

0 comments on commit 181c54b

Please sign in to comment.