Remove config.fnl from quire-ci
quire-ci is configured entirely via environment variables and CLI flags,
not a file. Drop quire.rs (GlobalConfig, QuireCi, config loading) and
the --base-dir CLI arg that pointed at the config directory.
https://claude.ai/code/session_0171wuJy2GRJZuj2oVYZ2iKe
diff --git a/quire-ci/src/main.rs b/quire-ci/src/main.rs
index 7418155..b66093e 100644
--- a/quire-ci/src/main.rs
+++ b/quire-ci/src/main.rs
@@ -45,10 +45,6 @@ const VERSION: &str = env!("QUIRE_VERSION");
/// Run and validate quire CI pipelines.
#[derive(Facet)]
struct Cli {
- /// Root directory for quire-ci data (default: /var/quire-ci).
- #[facet(args::named, default = "/var/quire-ci")]
- base_dir: PathBuf,
-
/// Workspace root containing .quire/ci.fnl. Defaults to cwd.
#[facet(args::named, args::short = 'w', default = ".")]
workspace: PathBuf,
diff --git a/quire-ci/src/quire.rs b/quire-ci/src/quire.rs
deleted file mode 100644
index 83b27f1..0000000
--- a/quire-ci/src/quire.rs
+++ /dev/null
@@ -1,110 +0,0 @@
-use std::path::PathBuf;
-
-use miette::{IntoDiagnostic, Result};
-
-use quire_core::fennel::Fennel;
-
-/// Parsed global configuration (`<base-dir>/config.fnl`).
-#[derive(serde::Deserialize, Debug, Clone)]
-#[serde(rename_all = "kebab-case")]
-pub struct GlobalConfig {
- #[serde(default)]
- pub sentry: Option<SentryConfig>,
- /// TCP port the HTTP server binds to on all interfaces (`0.0.0.0`).
- #[serde(default = "default_port")]
- pub port: u16,
-}
-
-fn default_port() -> u16 {
- 3000
-}
-
-pub use quire_core::telemetry::SentryConfig;
-
-/// Application runtime context.
-///
-/// Loads config at construction time so callers don't have to thread
-/// Results around.
-#[derive(Clone)]
-pub struct QuireCi {
- config: GlobalConfig,
-}
-
-impl QuireCi {
- pub fn new(base_dir: PathBuf) -> Result<Self> {
- let config_path = base_dir.join("config.fnl");
- let config = if config_path.exists() {
- let fennel = Fennel::new().into_diagnostic()?;
- fennel.load_file(&config_path).into_diagnostic()?
- } else {
- GlobalConfig::default()
- };
- Ok(Self { config })
- }
-
- pub fn config(&self) -> &GlobalConfig {
- &self.config
- }
-}
-
-impl Default for GlobalConfig {
- fn default() -> Self {
- Self {
- sentry: None,
- port: default_port(),
- }
- }
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn global_config_defaults() {
- let dir = tempfile::tempdir().expect("tempdir");
- let config_path = dir.path().join("config.fnl");
- fs_err::write(&config_path, "{}").expect("write");
-
- let q = QuireCi::new(dir.path().to_path_buf()).expect("should load");
- assert_eq!(q.config().port, 3000);
- }
-
- #[test]
- fn global_config_parses_custom_port() {
- let dir = tempfile::tempdir().expect("tempdir");
- let config_path = dir.path().join("config.fnl");
- fs_err::write(&config_path, r#"{:port 4000}"#).expect("write");
-
- let q = QuireCi::new(dir.path().to_path_buf()).expect("should load");
- assert_eq!(q.config().port, 4000);
- }
-
- #[test]
- fn global_config_missing_file_uses_defaults() {
- let dir = tempfile::tempdir().expect("tempdir");
-
- let q = QuireCi::new(dir.path().to_path_buf()).expect("should load");
- assert_eq!(q.config().port, 3000);
- assert!(q.config().sentry.is_none());
- }
-
- #[test]
- fn global_config_loads_sentry() {
- let dir = tempfile::tempdir().expect("tempdir");
- let config_path = dir.path().join("config.fnl");
- fs_err::write(
- &config_path,
- r#"{:sentry {:dsn "https://key@sentry.io/123"}}"#,
- )
- .expect("write");
-
- let q = QuireCi::new(dir.path().to_path_buf()).expect("should load");
- let sentry = q
- .config()
- .sentry
- .as_ref()
- .expect("sentry should be present");
- assert_eq!(sentry.dsn.reveal().unwrap(), "https://key@sentry.io/123");
- }
-}