Use generator to generate exceptions from yaml

Signed-off-by: Asai Neko <sugar@sne.moe>
This commit is contained in:
2026-01-21 13:48:37 +08:00
parent e4329dfc2b
commit ac428946e7
40 changed files with 291 additions and 149 deletions

View File

@@ -0,0 +1,8 @@
// Code generated by gen-exception; DO NOT EDIT.
package exception
const (
{{- range .Items }}
{{ .Name }} = "{{ .Value }}"
{{- end }}
)

97
cmd/gen_exception/main.go Normal file
View File

@@ -0,0 +1,97 @@
//go:build ignore
package main
import (
"fmt"
"log"
"os"
"path/filepath"
"strings"
"text/template"
"golang.org/x/text/cases"
"golang.org/x/text/language"
"gopkg.in/yaml.v3"
)
type ErrorItem struct {
Name string
Value string
}
type TplData struct {
Items []ErrorItem
}
func toCamel(s string) string {
caser := cases.Title(language.English)
s = strings.ReplaceAll(s, "-", "_")
parts := strings.Split(s, "_")
for i := range parts {
parts[i] = caser.String(parts[i])
}
return strings.Join(parts, "")
}
func recursiveParse(prefix string, raw any, items *[]ErrorItem) {
switch v := raw.(type) {
case map[string]any:
for key, val := range v {
recursiveParse(prefix+toCamel(key), val, items)
}
case string:
*items = append(*items, ErrorItem{
Name: prefix,
Value: v,
})
case int, int64:
*items = append(*items, ErrorItem{
Name: prefix,
Value: fmt.Sprintf("%v", v),
})
}
}
func main() {
yamlDir := "internal/exception/definitions"
outputDir := "internal/exception"
tplPath := "cmd/gen_exception/exception.tmpl"
if _, err := os.Stat(tplPath); os.IsNotExist(err) {
log.Fatalf("Cannot found tmpl %s", tplPath)
}
funcMap := template.FuncMap{"ToCamel": toCamel}
tmpl := template.Must(template.New("exception.tmpl").Funcs(funcMap).ParseFiles(tplPath))
os.MkdirAll(outputDir, 0755)
files, _ := filepath.Glob(filepath.Join(yamlDir, "*.yaml"))
for _, yamlFile := range files {
content, err := os.ReadFile(yamlFile)
if err != nil {
log.Printf("Read file error: %v", err)
continue
}
var rawData any
if err := yaml.Unmarshal(content, &rawData); err != nil {
log.Printf("Unmarshal error in %s: %v", yamlFile, err)
continue
}
var items []ErrorItem
recursiveParse("", rawData, &items)
baseName := strings.TrimSuffix(filepath.Base(yamlFile), filepath.Ext(yamlFile))
outputFileName := baseName + "_gen.go"
outputPath := filepath.Join(outputDir, outputFileName)
f, _ := os.Create(outputPath)
tmpl.Execute(f, TplData{Items: items})
f.Close()
fmt.Printf("Generated: %s (%d constants)\n", outputPath, len(items))
}
}

View File

@@ -1,12 +0,0 @@
package exception
const (
CommonErrorInvalidInput = "00001"
CommonErrorUnauthorized = "00002"
CommonErrorInternal = "00003"
CommonErrorPermissionDenied = "00004"
CommonErrorUuidParseFailed = "00005"
CommonErrorDatabase = "00006"
CommonErrorMissingUserId = "00007"
CommonErrorUserNotFound = "00008"
)

View File

@@ -1,32 +0,0 @@
package exception
// Middleware Service Endpoints
const (
MiddlewareEndpoint = "01"
)
// Auth Service Endpoints
const (
AuthRedirectEndpoint = "01"
AuthMagicEndpoint = "02"
AuthTokenEndpoint = "03"
AuthRefreshEndpoint = "04"
AuthExchangeEndpoint = "05"
)
// Event Service Endpoints
const (
EventInfoEndpoint = "01"
EventCheckinEndpoint = "02"
EventCheckinQueryEndpoint = "03"
EventCheckinSubmitEndpoint = "04"
)
// User Service Endpoints
const (
UserInfoEndpoint = "01"
UserUpdateEndpoint = "02"
UserListEndpoint = "03"
UserFullEndpoint = "04"
UserCreateEndpoint = "05"
)

View File

@@ -1,16 +0,0 @@
package exception
// Middleware Services
const (
MiddlewareGinLoggerService = "901"
MiddlewareJwtService = "902"
MiddlewarePermissionService = "903"
MiddlewareApiVersionService = "904"
)
// Application Services
const (
AuthService = "001"
UserService = "002"
EventService = "003"
)

View File

@@ -1,60 +0,0 @@
package exception
const (
ApiVersionNotFound = "00001"
// Auth Service
// Endpoint: AuthRedirectEndpoint (01)
AuthRedirectTokenInvalid = "00001"
AuthRedirectClientNotFound = "00002"
AuthRedirectUriMismatch = "00003"
AuthRedirectInvalidUri = "00004"
// Endpoint: AuthMagicEndpoint (02)
AuthMagicTurnstileFailed = "00001"
AuthMagicCodeGenFailed = "00002"
AuthMagicInvalidExternalUrl = "00003"
AuthMagicInvalidEmailConfig = "00004"
// Endpoint: AuthTokenEndpoint (03)
AuthTokenInvalidToken = "00001"
AuthTokenGenFailed = "00002"
// Endpoint: AuthRefreshEndpoint (04)
AuthRefreshInvalidToken = "00001"
AuthRefreshRenewFailed = "00002"
// Endpoint: AuthExchangeEndpoint (05)
AuthExchangeGetUserIdFailed = "00001"
AuthExchangeCodeGenFailed = "00002"
AuthExchangeInvalidRedirectUri = "00003"
// Event Service
// Endpoint: EventInfoEndpoint (01)
EventInfoNotFound = "00001"
// Endpoint: EventCheckinEndpoint (02)
EventCheckinGenCodeFailed = "00001"
// Endpoint: EventCheckinQueryEndpoint (03)
EventCheckinQueryRecordNotFound = "00001"
// Endpoint: EventCheckinSubmitEndpoint (04)
// (None)
// User Service
// Endpoint: UserInfoEndpoint (01)
// (None)
// Endpoint: UserUpdateEndpoint (02)
// (None)
// Endpoint: UserListEndpoint (03)
UserListMeilisearchFailed = "00001"
// Endpoint: UserFullEndpoint (04)
// (None)
// Endpoint: UserCreateEndpoint (05)
// (None)
)

View File

@@ -1,8 +0,0 @@
package exception
const (
ErrorStatusSuccess = "2"
ErrorStatusUser = "4"
ErrorStatusServer = "5"
ErrorStatusClient = "6"
)

View File

@@ -1,6 +0,0 @@
package exception
const (
ErrorTypeCommon = "0"
ErrorTypeSpecific = "1"
)

3
generate.go Normal file
View File

@@ -0,0 +1,3 @@
package main
//go:generate go run ./cmd/gen_exception/main.go

3
go.mod
View File

@@ -75,9 +75,10 @@ require (
golang.org/x/net v0.48.0 // indirect golang.org/x/net v0.48.0 // indirect
golang.org/x/sync v0.19.0 // indirect golang.org/x/sync v0.19.0 // indirect
golang.org/x/sys v0.39.0 // indirect golang.org/x/sys v0.39.0 // indirect
golang.org/x/text v0.32.0 // indirect golang.org/x/text v0.33.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gorm.io/driver/mysql v1.5.6 // indirect gorm.io/driver/mysql v1.5.6 // indirect
) )

2
go.sum
View File

@@ -348,6 +348,8 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

View File

@@ -0,0 +1,13 @@
// Code generated by gen-exception; DO NOT EDIT.
package exception
const (
CommonErrorInvalidInput = "00001"
CommonErrorUnauthorized = "00002"
CommonErrorInternal = "00003"
CommonErrorPermissionDenied = "00004"
CommonErrorUuidParseFailed = "00005"
CommonErrorDatabase = "00006"
CommonErrorMissingUserId = "00007"
CommonErrorUserNotFound = "00008"
)

View File

@@ -0,0 +1,10 @@
common:
error:
invalid_input: "00001"
unauthorized: "00002"
internal: "00003"
permission_denied: "00004"
uuid_parse_failed: "00005"
database: "00006"
missing_user_id: "00007"
user_not_found: "00008"

View File

@@ -0,0 +1,23 @@
endpoint:
auth:
service:
redirect: "01"
magic: "02"
token: "03"
refresh: "04"
exchange: "05"
event:
service:
info: "01"
checkin: "02"
checkin_query: "03"
checkin_submit: "04"
user:
service:
info: "01"
update: "02"
list: "03"
full: "04"
create: "05"
middleware:
service: "01"

View File

@@ -0,0 +1,5 @@
middleware:
gin_logger: "901"
jwt: "902"
permission: "903"
api_version: "904"

View File

@@ -0,0 +1,4 @@
service:
auth: "001"
user: "002"
event: "003"

View File

@@ -0,0 +1,27 @@
api:
version:
not_found: "00001"
auth:
redirect:
token_invalid: "00001"
client_not_found: "00002"
uri_mismatch: "00003"
invalid_uri: "00004"
magic:
turnstile_failed: "00001"
code_gen_failed: "00002"
invalid_external_url: "00003"
invalid_email_config: "00004"
token:
invalid_token: "00001"
gen_failed: "00002"
refresh:
invalid_token: "00001"
renew_failed: "00002"
exchange:
get_user_id_failed: "00001"
code_gen_failed: "00002"
invalid_redirect_uri: "00003"
user:
list:
meilisearch_failed: "00001"

View File

@@ -0,0 +1,5 @@
status:
success: "2"
user: "4"
server: "5"
client: "6"

View File

@@ -0,0 +1,3 @@
type:
common: "1"
specific: "0"

View File

@@ -0,0 +1,20 @@
// Code generated by gen-exception; DO NOT EDIT.
package exception
const (
EndpointAuthServiceExchange = "05"
EndpointAuthServiceRedirect = "01"
EndpointAuthServiceMagic = "02"
EndpointAuthServiceToken = "03"
EndpointAuthServiceRefresh = "04"
EndpointEventServiceCheckinQuery = "03"
EndpointEventServiceCheckinSubmit = "04"
EndpointEventServiceInfo = "01"
EndpointEventServiceCheckin = "02"
EndpointUserServiceList = "03"
EndpointUserServiceFull = "04"
EndpointUserServiceCreate = "05"
EndpointUserServiceInfo = "01"
EndpointUserServiceUpdate = "02"
EndpointMiddlewareService = "01"
)

View File

@@ -0,0 +1,9 @@
// Code generated by gen-exception; DO NOT EDIT.
package exception
const (
MiddlewareGinLogger = "901"
MiddlewareJwt = "902"
MiddlewarePermission = "903"
MiddlewareApiVersion = "904"
)

View File

@@ -0,0 +1,8 @@
// Code generated by gen-exception; DO NOT EDIT.
package exception
const (
ServiceUser = "002"
ServiceEvent = "003"
ServiceAuth = "001"
)

View File

@@ -0,0 +1,22 @@
// Code generated by gen-exception; DO NOT EDIT.
package exception
const (
ApiVersionNotFound = "00001"
AuthRefreshInvalidToken = "00001"
AuthRefreshRenewFailed = "00002"
AuthExchangeGetUserIdFailed = "00001"
AuthExchangeCodeGenFailed = "00002"
AuthExchangeInvalidRedirectUri = "00003"
AuthRedirectClientNotFound = "00002"
AuthRedirectUriMismatch = "00003"
AuthRedirectInvalidUri = "00004"
AuthRedirectTokenInvalid = "00001"
AuthMagicCodeGenFailed = "00002"
AuthMagicInvalidExternalUrl = "00003"
AuthMagicInvalidEmailConfig = "00004"
AuthMagicTurnstileFailed = "00001"
AuthTokenInvalidToken = "00001"
AuthTokenGenFailed = "00002"
UserListMeilisearchFailed = "00001"
)

View File

@@ -0,0 +1,9 @@
// Code generated by gen-exception; DO NOT EDIT.
package exception
const (
StatusClient = "6"
StatusSuccess = "2"
StatusUser = "4"
StatusServer = "5"
)

View File

@@ -0,0 +1,7 @@
// Code generated by gen-exception; DO NOT EDIT.
package exception
const (
TypeCommon = "1"
TypeSpecific = "0"
)

View File

@@ -1,7 +1,7 @@
package middleware package middleware
import ( import (
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/utils" "nixcn-cms/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"

View File

@@ -1,7 +1,7 @@
package middleware package middleware
import ( import (
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/pkgs/authtoken" "nixcn-cms/pkgs/authtoken"
"nixcn-cms/utils" "nixcn-cms/utils"

View File

@@ -2,7 +2,7 @@ package middleware
import ( import (
"nixcn-cms/data" "nixcn-cms/data"
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/utils" "nixcn-cms/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"

View File

@@ -4,7 +4,7 @@ import (
"fmt" "fmt"
"net/url" "net/url"
"nixcn-cms/data" "nixcn-cms/data"
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/pkgs/authcode" "nixcn-cms/pkgs/authcode"
"nixcn-cms/utils" "nixcn-cms/utils"

View File

@@ -2,7 +2,7 @@ package auth
import ( import (
"net/url" "net/url"
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/pkgs/authcode" "nixcn-cms/pkgs/authcode"
"nixcn-cms/pkgs/email" "nixcn-cms/pkgs/email"
"nixcn-cms/pkgs/turnstile" "nixcn-cms/pkgs/turnstile"

View File

@@ -3,7 +3,7 @@ package auth
import ( import (
"net/url" "net/url"
"nixcn-cms/data" "nixcn-cms/data"
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/pkgs/authcode" "nixcn-cms/pkgs/authcode"
"nixcn-cms/utils" "nixcn-cms/utils"

View File

@@ -1,7 +1,7 @@
package auth package auth
import ( import (
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/pkgs/authtoken" "nixcn-cms/pkgs/authtoken"
"nixcn-cms/utils" "nixcn-cms/utils"

View File

@@ -2,7 +2,7 @@ package auth
import ( import (
"nixcn-cms/data" "nixcn-cms/data"
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/pkgs/authcode" "nixcn-cms/pkgs/authcode"
"nixcn-cms/pkgs/authtoken" "nixcn-cms/pkgs/authtoken"
"nixcn-cms/utils" "nixcn-cms/utils"

View File

@@ -2,7 +2,7 @@ package event
import ( import (
"nixcn-cms/data" "nixcn-cms/data"
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/utils" "nixcn-cms/utils"
"time" "time"

View File

@@ -2,7 +2,7 @@ package event
import ( import (
"nixcn-cms/data" "nixcn-cms/data"
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/utils" "nixcn-cms/utils"
"time" "time"

View File

@@ -2,7 +2,7 @@ package user
import ( import (
"nixcn-cms/data" "nixcn-cms/data"
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/utils" "nixcn-cms/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"

View File

@@ -2,7 +2,7 @@ package user
import ( import (
"nixcn-cms/data" "nixcn-cms/data"
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/utils" "nixcn-cms/utils"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"

View File

@@ -2,7 +2,7 @@ package user
import ( import (
"nixcn-cms/data" "nixcn-cms/data"
"nixcn-cms/exception" "nixcn-cms/internal/exception"
"nixcn-cms/utils" "nixcn-cms/utils"
"strconv" "strconv"

View File

@@ -3,8 +3,8 @@ package user
import ( import (
"net/url" "net/url"
"nixcn-cms/data" "nixcn-cms/data"
"nixcn-cms/exception"
"nixcn-cms/internal/cryptography" "nixcn-cms/internal/cryptography"
"nixcn-cms/internal/exception"
"nixcn-cms/utils" "nixcn-cms/utils"
"unicode/utf8" "unicode/utf8"