What if decide() and output() weren't fallible?
In iocaine3, decide() returns a String? (ie, Option<String>), mostly because some bad abstractions made that necessary. Like, all matchers are the same type in iocaine3, and they get internally dispatched. If I want matcher-specific functionality, I do matcher.as_asn_matcher()? or similar, and that's why the function returns an Option.
There are a few more things in iocaine3 that can technically fail, like HTML escaping, various config-extraction stuff, .choose(rng) from a list, etc. Some of those (config extraction stuff) will remain failible in iocaine4, but they should be called at ~compile time only, where validate_config() is fallible.
The rest, HTML escaping, .choose(rng), and a couple of others... when those fail, chances are, we should panic and abort instead, because we're in a terrible situation not worth recovering from.
On the other hand, if I keep them fallible, that means one can - in the future - use fallible functions within them, should they wish to. If they don't, then all the fallibility requires is a
-> Result[String, Report]signature, and anOk(decision)in the end. That's very little boilerplate.