fix(cli): render sweep-boundary bind errors as prose, not Debug structs
The blueprint-sweep terminal rendered BindError via {:?}, leaking
KindMismatch { .. } and MissingKnob(..) Rust Debug structs where the
sibling diagnostic on the same verb ships prose. Both now render in
that register — the axis name, the expected-vs-supplied kinds resp.
the unbound knob, and the --list-axes pointer; exit stays 2.
Scoped out (same defect family, different verb path): the walkforward
path's UnknownKnob wrapper still prints its Debug-ish frame around an
already-prose payload and is pinned verbatim by two existing tests;
filed as a follow-up rather than widened into this slice.
closes #247
This commit is contained in:
@@ -1915,6 +1915,31 @@ fn override_paths(
|
||||
Ok(overrides)
|
||||
}
|
||||
|
||||
/// Renders a [`BindError`] as one-line prose in `override_paths`' sibling
|
||||
/// register above (#247) — never the raw Rust `Debug` struct name
|
||||
/// (`KindMismatch { .. }` / `MissingKnob("..")`), the two variants the sweep
|
||||
/// terminal actually raises past `override_paths`' own pre-flight (which
|
||||
/// already rejects an unresolvable axis name as prose before either call
|
||||
/// site below ever reaches the terminal). Other variants keep the
|
||||
/// established `{:?}` rendering unchanged — in particular `UnknownKnob`
|
||||
/// already carries a fully-prosed message string at both call sites here
|
||||
/// (wrapped from `override_paths`' own `Result<_, String>`), and pinned
|
||||
/// tests (`aura_walkforward_emits_an_unknown_axis_rejection_once` et al.)
|
||||
/// depend on that Debug-wrapped shape.
|
||||
fn render_bind_error(e: &BindError) -> String {
|
||||
match e {
|
||||
BindError::MissingKnob(name) => format!(
|
||||
"axis {name}: an open param with no axis and no bound default — \
|
||||
bind it with `--axis {name}=<value>` — see `aura sweep <bp> --list-axes`"
|
||||
),
|
||||
BindError::KindMismatch { knob, expected, got } => format!(
|
||||
"axis {knob}: expected {expected:?}, supplied {got:?} — \
|
||||
see `aura sweep <bp> --list-axes`"
|
||||
),
|
||||
other => format!("{other:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Apply a validated override set to a freshly loaded strategy (#246).
|
||||
/// Infallible by contract: the set was derived against this same document at
|
||||
/// the family boundary.
|
||||
@@ -2015,9 +2040,9 @@ fn blueprint_sweep_family(
|
||||
// the shared reduce-mode member path — the same fn reproduction re-runs.
|
||||
run_blueprint_member(reload(doc), point, &space, data.run_sources(env, &binding.columns()), window, 0, pip, &topo, env, StopRule::Vol { length: R_SMA_STOP_LENGTH, k: R_SMA_STOP_K }, &binding, &[])
|
||||
})
|
||||
// render the sweep terminal's BindError to a message (the fn's String error contract),
|
||||
// so `UnknownKnob("nope")` still surfaces verbatim at the IO wrapper.
|
||||
.map_err(|e| format!("{e:?}"))
|
||||
// render the sweep terminal's BindError to prose (#247), the fn's String error
|
||||
// contract — never the raw Debug struct.
|
||||
.map_err(|e| render_bind_error(&e))
|
||||
}
|
||||
|
||||
/// Sweep the LOADED blueprint over the user `--axis` grid on an in-sample window
|
||||
@@ -2188,7 +2213,7 @@ fn blueprint_walkforward_family(
|
||||
// (#253): `validate_axis_grid` resolves the SAME grid the sweep terminal would, without
|
||||
// running a single member — no IS window (or a second roller) is needed here at all.
|
||||
if let Err(e) = validate_axis_grid(doc, axes, &raw_space, &probe_signal, env) {
|
||||
eprintln!("aura: {e:?}");
|
||||
eprintln!("aura: {}", render_bind_error(&e));
|
||||
std::process::exit(2);
|
||||
}
|
||||
walk_forward(roller, space.clone(), |w: WindowBounds| {
|
||||
|
||||
Reference in New Issue
Block a user