pub enum CliError {
Show 16 variants
Store(StoreError),
Core(CoreError),
Adapter(AdapterError),
Sqlite(Error),
Csv(Error),
Io(Error),
FormFill(FormsError),
BadEventRef(String),
Usage(String),
BadConfigValue {
key: String,
value: String,
},
StaleReturnInputs {
year: i32,
found: i64,
expected: i64,
},
StaleParkedDraft {
year: i32,
found: i64,
expected: i64,
},
ParkedDraftBlocksWrite {
year: i32,
},
AttestationRequired,
AttestationFailed,
PathIo {
path: String,
hint: String,
source: Error,
},
}Variants§
Store(StoreError)
Core(CoreError)
Adapter(AdapterError)
Sqlite(Error)
Csv(Error)
C1: write_csv_exports (Task 15) uses ? on csv::Writer ops (→ csv::Error); csv::Error
is its own type (NOT covered by Io(#[from] io::Error), whose From goes the other way), so it
needs its own variant or Task 15 will not compile.
Io(Error)
FormFill(FormsError)
export-irs-pdf: an official IRS PDF fill failed — most importantly the geometric read-back
FAILING CLOSED on a mis-mapped cell, so no wrong tax form is ever written.
BadEventRef(String)
A user-supplied event reference did not parse as a canonical EventId (eventref.rs).
Usage(String)
A CLI argument was malformed (bad USD/date/enum/wallet spec, or a contradictory flag set).
BadConfigValue
M1: a cli_config row held an unrecognized value (corrupt DB, future-written value, or manual
edit gone wrong). Returning an error is safer than silently misreading the stored intent.
StaleReturnInputs
P9 §2.6: a stored return_inputs row predates the form-question registry (or was written by a newer
build) and this build does not migrate it. There is no user data yet, so the policy is refuse-and-
reimport rather than a per-key migration (a version check cannot forget a key). The remedy names all
THREE commands, in order — clear DISCARDS any computed carryover this row’s prior reports wrote onto
it, so the rebuild step is not optional. (Retire this the moment real data exists — FOLLOWUPS, release
gate.)
StaleParkedDraft
§6.3 / C-1: a PARKED input-form draft is at a schema version this build does not read, and this
build does not migrate it. Unlike a stale WIP draft (regenerable → discarded), a parked draft may
hold irreplaceable carryover that exists ONLY in the draft — there is no committed row to re-import
from — so we REFUSE (fail closed) rather than discard. The remedy therefore is NOT income import
(that recovers a WIP row from committed state, which a parked draft has none of): the message must
tell the filer the data lives in the draft, must not be discarded, and to re-run on / export from the
app version that wrote it. (Retire alongside StaleReturnInputs the moment migrations exist.)
ParkedDraftBlocksWrite
§6.2 draft-coherence: an authoritative committed-row write (income import / income answer /
carryover write-back / income clear) was attempted for a year whose input-form draft is PARKED.
A parked draft is the SOLE copy of a screened return (C-1) — clobbering it via the committed row
would silently destroy irreplaceable data — so the write is REFUSED (fail closed). The message
names BOTH in-form exits (M-d): re-commit it (use full return) or drop it (discard parked draft, a confirmed delete); a WIP draft, by contrast, is regenerable and is cleared silently.
AttestationRequired
Sub-project 3 attestation gate: an export was attempted while the ledger is pseudo-reconciled (a synthetic, non-persisted default contributes to the projection) and NO attestation phrase was supplied. Producing a form/data file from a fictional draft requires typing the exact phrase. (Supersedes sub-2’s interim [I3] blanket refusal.)
AttestationFailed
Sub-project 3 attestation gate: an export was attempted while the ledger is pseudo-reconciled and the supplied attestation phrase did NOT match (trimmed, case-sensitive, exact). A wrong phrase is FAILED regardless of environment [R0-I1] — no fictional form leaves the machine.
PathIo
UX-P4-8: an I/O failure at a user-named path — a --vault that is missing/unreadable, or an
--out that collides / cannot be created. Carries the offending PATH and a one-clause remedy
hint that the bare io::Error (surfaced pathlessly through Store::Io / Io) lacks. Mirrors
the adapters’ AdapterError::Io { path, source } so every path-bearing io error reads alike.
Trait Implementations§
Source§impl Error for CliError
impl Error for CliError
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()