Is it really better to remove the error case information from the type signature? Aren't we losing vital information here?
type Result<T> = std::result::Result<T, io::Error>;
So it's actually fine, since we're specifying it's an IO result. This is a fairly common pattern.