https://kiet.blog/posts/custom-error-handling-in-go/