fatih/structtag

Unexported error sentinel values

romshark opened this issue · 1 comments

structtag/tags.go

Lines 11 to 19 in 2977b8d

var (
errTagSyntax = errors.New("bad syntax for struct tag pair")
errTagKeySyntax = errors.New("bad syntax for struct tag key")
errTagValueSyntax = errors.New("bad syntax for struct tag value")
errKeyNotSet = errors.New("tag key does not exist")
errTagNotExist = errors.New("tag does not exist")
errTagKeyMismatch = errors.New("mismatch between key and tag.key")
)

Is there a particular reason these error sentinel values are unexported?
Because of this I have to match errors by message, which is obviously bad:

tag, err := tags.Get(expectTag)
switch {
case err.Error() == "tag does not exist":
	// handle errTagNotExist
case err != nil:
	// handle other errors
}

Instead, it should be:

tag, err := tags.Get(expectTag)
switch {
case errors.Is(err, structtag.ErrTagNotExist):
	// handle
case err != nil:
	// handle other errors
}

I propose exporting error sentinel values. Such a change would be backward compatible anyway.

fatih commented

Hi @romshark

There are no particular reasons for that. The only thing was I didn't wanted to make it part of the public API, because then it would mean I wouldn't be able to make any changes. So it's an additional layer of maintenance we have to take care of. I wrote it here: #16

But given the fact this is something people rely on it, I think it makes sense to expose them.

Would you mind opening a PR? The #16 is not mergable anymore. Let's fix this.