From 0cd8af9c8114f24f363f8a618f8471b52e0e0131 Mon Sep 17 00:00:00 2001 From: wires Date: Sat, 22 Mar 2025 12:34:42 -0400 Subject: [PATCH] add basic settings stuff --- .gitignore | 3 + Cargo.lock | 205 ++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 5 ++ src/main.rs | 21 ++--- src/settings.rs | 28 +++++++ 5 files changed, 253 insertions(+), 9 deletions(-) create mode 100644 src/settings.rs diff --git a/.gitignore b/.gitignore index ea8c4bf..7ed5330 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ /target + +# testing artifact +/parsers diff --git a/Cargo.lock b/Cargo.lock index e8197c1..acfe70d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -75,15 +75,26 @@ dependencies = [ "shlex", ] +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + [[package]] name = "chrysopoeia" version = "0.1.0" dependencies = [ "anyhow", "clap", + "config", "git2", + "lazy_static", "phf", + "serde", + "tempfile", "thiserror", + "xdg", ] [[package]] @@ -132,6 +143,18 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "config" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595aae20e65c3be792d05818e8c63025294ac3cb7e200f11459063a352a6ef80" +dependencies = [ + "pathdiff", + "serde", + "toml", + "winnow", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -143,6 +166,28 @@ dependencies = [ "syn", ] +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -152,6 +197,18 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi", +] + [[package]] name = "git2" version = "0.20.1" @@ -167,6 +224,12 @@ dependencies = [ "url", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "heck" version = "0.5.0" @@ -312,6 +375,16 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "indexmap" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +dependencies = [ + "equivalent", + "hashbrown", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -327,6 +400,12 @@ dependencies = [ "libc", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.171" @@ -373,6 +452,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linux-raw-sys" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" + [[package]] name = "litemap" version = "0.7.5" @@ -385,6 +470,12 @@ version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + [[package]] name = "once_cell" version = "1.21.1" @@ -409,6 +500,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -481,6 +578,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.8.5" @@ -496,6 +599,19 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +[[package]] +name = "rustix" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + [[package]] name = "serde" version = "1.0.219" @@ -516,6 +632,15 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "shlex" version = "1.3.0" @@ -568,6 +693,19 @@ dependencies = [ "syn", ] +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys", +] + [[package]] name = "thiserror" version = "2.0.12" @@ -598,6 +736,40 @@ dependencies = [ "zerovec", ] +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "unicode-ident" version = "1.0.18" @@ -639,6 +811,15 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "windows-sys" version = "0.59.0" @@ -712,6 +893,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + [[package]] name = "write16" version = "1.0.0" @@ -724,6 +923,12 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +[[package]] +name = "xdg" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546" + [[package]] name = "yoke" version = "0.7.5" diff --git a/Cargo.toml b/Cargo.toml index 2716391..342df3a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,11 @@ license = "GPL-3.0-only" [dependencies] anyhow = "1.0.97" clap = { version = "4.5.32", features = ["derive"] } +config = { version = "0.15.11", default-features = false, features = ["toml"] } git2 = "0.20.1" +lazy_static = "1.5.0" phf = { version = "0.11.3", features = ["macros"] } +serde = { version = "1.0.219", features = ["derive"] } +tempfile = "3.19.1" thiserror = "2.0.12" +xdg = "2.5.2" diff --git a/src/main.rs b/src/main.rs index a75ab4a..f2e4438 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,11 @@ -use std::{ - env::consts::DLL_EXTENSION, - fs::{canonicalize, create_dir_all}, - path::PathBuf, -}; +use std::{env::consts::DLL_EXTENSION, fs::create_dir_all}; use clap::Parser; use git2::Repository; mod cc; mod languages; +mod settings; use languages::{InstallInfo, get_install_info}; use settings::{Settings, get_settings}; @@ -22,16 +19,19 @@ struct Cli { fn main() -> anyhow::Result<()> { let Cli { language } = Cli::parse(); - let parser_dir = canonicalize(PathBuf::from("parsers"))?; - let src_dir = PathBuf::from("parser_src"); + let Settings { parser_dir } = get_settings()?; + + let src_dir = tempfile::tempdir()?; create_dir_all(&parser_dir)?; - create_dir_all(&src_dir)?; + + // have to use a canonical path bc compiler runs elsewhere + let parser_dir = parser_dir.canonicalize()?; let InstallInfo { url, files } = get_install_info(&language).ok_or(anyhow::anyhow!("unknown language `{language}`"))?; - let repo_path = src_dir.join(&language); + let repo_path = src_dir.as_ref().join(&language); Repository::clone(url, &repo_path)?; let output_path = parser_dir.join(language).with_extension(DLL_EXTENSION); @@ -40,5 +40,8 @@ fn main() -> anyhow::Result<()> { build.dir(&repo_path).input_files(files); build.compile(&output_path)?; + // close explicitly to prevent premature drop + src_dir.close()?; + Ok(()) } diff --git a/src/settings.rs b/src/settings.rs new file mode 100644 index 0000000..293e668 --- /dev/null +++ b/src/settings.rs @@ -0,0 +1,28 @@ +use std::path::PathBuf; + +use config::{Config, ConfigError, File}; +use lazy_static::lazy_static; +use serde::Deserialize; + +lazy_static! { + static ref XDG: xdg::BaseDirectories = + xdg::BaseDirectories::with_prefix("chrysopoeia").unwrap(); +} + +#[derive(Debug, Default, Deserialize)] +pub struct Settings { + #[serde(default = "default_parser_dir")] + pub parser_dir: PathBuf, +} + +fn default_parser_dir() -> PathBuf { + XDG.get_data_file("parsers") +} + +pub fn get_settings() -> Result { + Config::builder() + .add_source(File::from(XDG.get_config_file("config")).required(false)) + .add_source(File::with_name("chrysopoeia").required(false)) + .build()? + .try_deserialize::() +}