Use TransportMode directly in QuireConfig instead of String
Add Facet derive to TransportMode so figue can parse it from
QUIRE__TRANSPORT directly, removing the manual .parse::<TransportMode>()
call in main. Also adds facet as a quire-core dependency.
https://claude.ai/code/session_01NFGc15XXN1PGGa2hFom7RA
diff --git a/Cargo.lock b/Cargo.lock
index fee7cb8..a1e26dc 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2514,6 +2514,7 @@ dependencies = [
name = "quire-core"
version = "0.1.0"
dependencies = [
+ "facet",
"fs-err",
"jiff",
"miette",
diff --git a/quire-ci/src/main.rs b/quire-ci/src/main.rs
index 6441af5..7f33315 100644
--- a/quire-ci/src/main.rs
+++ b/quire-ci/src/main.rs
@@ -77,10 +77,9 @@ struct QuireConfig {
#[facet(sensitive, default)]
auth_token: String,
- /// Transport mode: `filesystem` (default) or `api`
- /// (`QUIRE__TRANSPORT`).
- #[facet(default = "filesystem")]
- transport: String,
+ /// Transport mode (`QUIRE__TRANSPORT`).
+ #[facet(default)]
+ transport: TransportMode,
/// Sentry DSN for error reporting (`QUIRE__SENTRY_DSN`).
#[facet(default)]
@@ -282,12 +281,6 @@ fn main() -> Result<()> {
}
};
- let transport_mode = cli
- .quire
- .transport
- .parse::<TransportMode>()
- .map_err(|e| miette!("{e}"))?;
-
let (git_dir, meta, sentry_handoff) = load_bootstrap(&PathBuf::from(&bootstrap))?;
// Sentry's reqwest transport spawns Tokio tasks for HTTP
@@ -322,7 +315,7 @@ fn main() -> Result<()> {
};
let transport = Transport {
session: session.clone(),
- mode: transport_mode,
+ mode: cli.quire.transport,
};
let client = ApiClient::new(session);
diff --git a/quire-core/Cargo.toml b/quire-core/Cargo.toml
index 8331eab..5d63cdf 100644
--- a/quire-core/Cargo.toml
+++ b/quire-core/Cargo.toml
@@ -4,6 +4,7 @@ version = "0.1.0"
edition = "2024"
[dependencies]
+facet = "*"
fs-err = { workspace = true }
jiff = { workspace = true }
miette = { workspace = true }
diff --git a/quire-core/src/ci/transport.rs b/quire-core/src/ci/transport.rs
index 92f4a44..416a0fc 100644
--- a/quire-core/src/ci/transport.rs
+++ b/quire-core/src/ci/transport.rs
@@ -22,8 +22,9 @@ pub struct ApiSession {
}
/// Transport mode for CI ↔ server communication.
-#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, serde::Deserialize)]
+#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, facet::Facet, serde::Deserialize)]
#[serde(rename_all = "kebab-case")]
+#[repr(u8)]
pub enum TransportMode {
#[default]
Filesystem,