Prefer into_diagnostic over map_err; make parse_events_target infallible
parse_events_target could never actually fail (every input maps to a
valid EventsTarget), so make it return EventsTarget directly. The
figue builder error uses into_diagnostic instead of map_err.

https://claude.ai/code/session_01NFGc15XXN1PGGa2hFom7RA
change
commit b3f6e09bdd02d9fe8bc007ebf5f4a692738e7656
author Claude <noreply@anthropic.com>
date
parent 88882a14
diff --git a/quire-ci/src/main.rs b/quire-ci/src/main.rs
index 7f33315..e00e8d5 100644
--- a/quire-ci/src/main.rs
+++ b/quire-ci/src/main.rs
@@ -7,7 +7,7 @@ use std::rc::Rc;
 
 use facet::Facet;
 use figue::{self as args, Driver, FigueBuiltins};
-use miette::{IntoDiagnostic, Result, miette};
+use miette::{IntoDiagnostic, Result};
 use quire_core::api::SecretResponse;
 use quire_core::ci::bootstrap::{Bootstrap, SentryHandoff};
 use quire_core::ci::event::{Event, EventKind, JobOutcome, RunOutcome};
@@ -183,11 +183,11 @@ enum EventsTarget {
     File(PathBuf),
 }
 
-fn parse_events_target(s: &str) -> Result<EventsTarget, String> {
+fn parse_events_target(s: &str) -> EventsTarget {
     match s {
-        "null" => Ok(EventsTarget::Null),
-        "stdout" => Ok(EventsTarget::Stdout),
-        path => Ok(EventsTarget::File(PathBuf::from(path))),
+        "null" => EventsTarget::Null,
+        "stdout" => EventsTarget::Stdout,
+        path => EventsTarget::File(PathBuf::from(path)),
     }
 }
 
@@ -243,7 +243,7 @@ fn main() -> Result<()> {
     miette::set_panic_hook();
 
     let config = figue::builder::<Cli>()
-        .map_err(|e| miette!("{e}"))?
+        .into_diagnostic()?
         .cli(|cli| cli.args(std::env::args().skip(1)))
         .env(|env| env)
         .help(|h| h.program_name("quire-ci").version(VERSION))
@@ -259,8 +259,7 @@ fn main() -> Result<()> {
             out_dir,
             bootstrap,
         } => {
-            let events = parse_events_target(&events).map_err(|e| miette!("{e}"))?;
-            let sink: Box<dyn EventSink> = match events {
+            let sink: Box<dyn EventSink> = match parse_events_target(&events) {
                 EventsTarget::Null => Box::new(NullSink),
                 EventsTarget::Stdout => Box::new(JsonlSink::new(io::stdout())),
                 EventsTarget::File(path) => {
@@ -595,15 +594,12 @@ mod tests {
 
     #[test]
     fn parse_events_target_classifies_input() {
-        assert!(matches!(
-            parse_events_target("null"),
-            Ok(EventsTarget::Null)
-        ));
+        assert!(matches!(parse_events_target("null"), EventsTarget::Null));
         assert!(matches!(
             parse_events_target("stdout"),
-            Ok(EventsTarget::Stdout)
+            EventsTarget::Stdout
         ));
-        let Ok(EventsTarget::File(path)) = parse_events_target("/tmp/run.jsonl") else {
+        let EventsTarget::File(path) = parse_events_target("/tmp/run.jsonl") else {
             panic!("expected File target");
         };
         assert_eq!(path, PathBuf::from("/tmp/run.jsonl"));