Use NamedSource in FennelError::Eval so miette shows filename in source header
Previously `#[source_code]` held a plain `String`, so miette rendered the
source-block header as `[5:1]` (just line:col). Switching to
`NamedSource<String>` makes it show `[ci.fnl:5:1]`, consistent with how
`PipelineError` already labels its source block.

https://claude.ai/code/session_016ieFpQg1FfFhs6meg1aRom
change
commit 20e521d89598cd4247704f632d2f79e2ae5ffe88
author Claude <noreply@anthropic.com>
date
parent 52367f2d
diff --git a/quire-core/src/fennel.rs b/quire-core/src/fennel.rs
index 2d37189..08b8c9e 100644
--- a/quire-core/src/fennel.rs
+++ b/quire-core/src/fennel.rs
@@ -1,6 +1,6 @@
 use std::path::Path;
 
-use miette::{Diagnostic, SourceOffset};
+use miette::{Diagnostic, NamedSource, SourceOffset};
 use mlua::{Lua, LuaSerdeExt};
 use thiserror::Error;
 
@@ -39,7 +39,7 @@ pub enum FennelError {
     Eval {
         message: String,
         #[source_code]
-        source_code: String,
+        source_code: NamedSource<String>,
         #[label("here")]
         label: Option<SourceOffset>,
         #[source]
@@ -230,7 +230,7 @@ impl FennelError {
 
         FennelError::Eval {
             message,
-            source_code: source.to_string(),
+            source_code: NamedSource::new(name, source.to_string()),
             label,
             source: Box::new(err),
         }
@@ -393,7 +393,7 @@ mod tests {
             message.len() > "bad.fnl: ".len(),
             "message should include the lua error detail, got {message:?}"
         );
-        assert_eq!(source_code, source);
+        assert_eq!(source_code.inner(), source);
         assert!(
             label.is_some(),
             "label should be set for line-bearing error"