|
@@ -2,54 +2,74 @@ package domain
|
|
|
|
|
|
import (
|
|
|
"errors"
|
|
|
- "fmt"
|
|
|
-)
|
|
|
-
|
|
|
-type ErrorKind int
|
|
|
-
|
|
|
-const (
|
|
|
- NoError ErrorKind = iota
|
|
|
- Unimplemented
|
|
|
-
|
|
|
- ShortNotCreated
|
|
|
- ShortNotFound
|
|
|
|
|
|
- TargetBlockedError
|
|
|
- TargetCensoredError
|
|
|
- TargetInvalidError
|
|
|
-
|
|
|
- StorageReadError
|
|
|
- StorageWriteError
|
|
|
- StorageUnspecifiedError
|
|
|
+ "github.com/nicksnyder/go-i18n/v2/i18n"
|
|
|
)
|
|
|
|
|
|
-var Errors = map[ErrorKind]string{
|
|
|
- NoError: "No error",
|
|
|
- Unimplemented: "Not yet implemented",
|
|
|
-
|
|
|
- ShortNotCreated: "Short URL not created for a new target",
|
|
|
- ShortNotFound: "Short URL not defined",
|
|
|
+type ErrorKind = string
|
|
|
|
|
|
- TargetBlockedError: "Target blocked",
|
|
|
- TargetCensoredError: "Target unavailable for legal reasons",
|
|
|
- TargetInvalidError: "Target invalid",
|
|
|
+var NoError = i18n.Message{ID: "error.none", Other: "No error"}
|
|
|
+var Unimplemented = i18n.Message{ID: "error.unimplemented", Other: "Not yet implemented"}
|
|
|
+var ShortNotCreated = i18n.Message{ID: "short_not_created", Other: "Short URL not created for a new target"}
|
|
|
+var TargetInvalid = i18n.Message{ID: "error.target_invalid", Other: "Target invalid"}
|
|
|
+var ShortNotFound = i18n.Message{ID: "short_not_found", Other: "Short URL not defined"}
|
|
|
+var TargetBlocked = i18n.Message{ID: "target_blocked", Other: "Target blocked"}
|
|
|
+var TargetCensored = i18n.Message{ID: "target_censored", Other: "Target unavailable for legal reasons"}
|
|
|
+var StorageRead = i18n.Message{ID: "storage_read", Other: "Storage read error"}
|
|
|
+var StorageWrite = i18n.Message{ID: "storage_write", Other: "Storage write error"}
|
|
|
+var StorageUnspecified = i18n.Message{ID: "storage_unspecified", Other: "Storage unspecified error"}
|
|
|
|
|
|
- StorageReadError: "Storage read error",
|
|
|
- StorageWriteError: "Storage write error",
|
|
|
- StorageUnspecifiedError: "Storage unspecified error",
|
|
|
+var ErrorMessages = map[ErrorKind]i18n.Message{
|
|
|
+ NoError.ID: NoError,
|
|
|
+ Unimplemented.ID: Unimplemented,
|
|
|
+ ShortNotCreated.ID: ShortNotCreated,
|
|
|
+ ShortNotFound.ID: ShortNotFound,
|
|
|
+ TargetBlocked.ID: TargetBlocked,
|
|
|
+ TargetCensored.ID: TargetCensored,
|
|
|
+ StorageRead.ID: StorageRead,
|
|
|
+ StorageWrite.ID: StorageWrite,
|
|
|
+ StorageUnspecified.ID: StorageUnspecified,
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
type Error struct {
|
|
|
error
|
|
|
Kind ErrorKind
|
|
|
}
|
|
|
|
|
|
-func MakeError(kind ErrorKind, detail string) Error {
|
|
|
+
|
|
|
+func MakeError(l *i18n.Localizer, kind ErrorKind, detail string) Error {
|
|
|
+ format := i18n.Message{
|
|
|
+ ID: "web.error.format",
|
|
|
+ Description: "The format for errors",
|
|
|
+ One: "{.Kind}: {.Detail}",
|
|
|
+ }
|
|
|
var message string
|
|
|
+
|
|
|
if len(detail) == 0 {
|
|
|
- message = Errors[kind]
|
|
|
+ message = l.MustLocalize(&i18n.LocalizeConfig{
|
|
|
+ MessageID: ErrorMessages[kind].ID,
|
|
|
+ })
|
|
|
} else {
|
|
|
- message = fmt.Sprintf("%s: %s", Errors[kind], detail)
|
|
|
+ em, ok := ErrorMessages[kind]
|
|
|
+ if !ok {
|
|
|
+ em = i18n.Message{
|
|
|
+ ID: "error.dynamic",
|
|
|
+ Description: "This is an unplanned error generated on the fly from details. It should be replaced",
|
|
|
+ }
|
|
|
+ }
|
|
|
+ localizedKind := l.MustLocalize(&i18n.LocalizeConfig{
|
|
|
+ DefaultMessage: &em,
|
|
|
+ MessageID: em.ID,
|
|
|
+ })
|
|
|
+ message = l.MustLocalize(&i18n.LocalizeConfig{
|
|
|
+ DefaultMessage: &format,
|
|
|
+ TemplateData: map[string]string{
|
|
|
+ "Kind": localizedKind,
|
|
|
+ "Detail": detail,
|
|
|
+ },
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
return Error{
|