Como você define tipos personalizados de `Error` no Rust?

Estou escrevendo uma função que pode retornar vários erros diferentes.

fn foo(...) -> Result<..., MyError> {}

Provavelmente vou precisar definir meu próprio tipo de erro para representar esses erros. Estou presumindo que seria umenum possíveis erros, com alguns dosenum variantes com dados de diagnóstico anexados a eles:

enum MyError {
    GizmoError,
    WidgetNotFoundError(widget_name: String)
}

Essa é a maneira mais idiomática de fazer isso? E como faço para implementar oError traço?

questionAnswers(3)

yourAnswerToTheQuestion