Looking at it that way, I think it's possible to make "expect" more comfortable to read by how you phrase your error messages.
Instead of
let mut file = File::open("conf.json")
.expect("could not open file");
and
let config: Value = serde::from_reader(file)
.expect("config has invalid json");
and
let jenkins_server = config.get("jenkins_server")
.expect("jenkins_server key not in config")
.as_str()
.expect("jenkins_server key is not a string");
One could write
let mut file = File::open("conf.json")
.expect("Need to be able to open file `conf.json'.");
and
let config: Value = serde::from_reader(file)
.expect("The file `conf.json' must contain valid JSON.");
and
let jenkins_server = config.get("jenkins_server")
.expect("The config must have a key named `jenkins_server'.")
.as_str()
.expect("The config value of `jenkins_server' must be a string.");
Something like that.