Files
2026-09-26 16:32:40 +03:00

141 lines
3.8 KiB
Go

package errs
import (
"errors"
"fmt"
"strings"
"aego/core/log"
)
type Code string
const (
PlatformInit Code = "platform.init"
PlatformWindow Code = "platform.window"
PlatformContext Code = "platform.context"
PlatformConfig Code = "platform.config"
GPUInit Code = "gpu.init"
GPUShaderCompile Code = "gpu.shader.compile"
GPUShaderLink Code = "gpu.shader.link"
GPUResource Code = "gpu.resource"
GPUInvalidHandle Code = "gpu.handle.invalid"
VFSNotFound Code = "vfs.not_found"
VFSReadOnly Code = "vfs.read_only"
VFSBadPath Code = "vfs.bad_path"
VFSUnknownScheme Code = "vfs.unknown_scheme"
VFSIO Code = "vfs.io"
VFSMount Code = "vfs.mount"
EngineConfig Code = "engine.config"
EngineInit Code = "engine.init"
EngineModule Code = "engine.module"
EngineFrozen Code = "engine.registry.frozen"
EngineSystemDup Code = "engine.system.duplicate"
EngineSystemBad Code = "engine.system.invalid"
EngineSystemDep Code = "engine.system.unknown_dependency"
EngineSystemPhase Code = "engine.system.phase_mismatch"
EngineSystemCycle Code = "engine.system.cycle"
IDBadFormat Code = "ids.bad_format"
SchemaFrozen Code = "schema.frozen"
SchemaDuplicate Code = "schema.duplicate"
SchemaCollision Code = "schema.hash_collision"
SchemaBadField Code = "schema.bad_field"
SchemaBadValue Code = "schema.bad_value"
SchemaUnknownType Code = "schema.unknown_type"
SchemaNotStruct Code = "schema.not_struct"
SceneDeadNode Code = "scene.dead_node"
SceneBadReparent Code = "scene.bad_reparent"
SceneUnknownComponent Code = "scene.unknown_component"
SceneNoComponent Code = "scene.no_component"
SceneReadOnly Code = "scene.read_only"
AssetBadIndex Code = "asset.bad_index"
AssetBadArtifact Code = "asset.bad_artifact"
AssetNotFound Code = "asset.not_found"
AssetLoadFailed Code = "asset.load_failed"
AssetNotMounted Code = "asset.not_mounted"
AssetBadMeta Code = "asset.bad_meta"
AssetBadImporter Code = "asset.bad_importer"
AssetImportFailed Code = "asset.import_failed"
AssetNoProject Code = "asset.no_project"
AssetSourceUnstable Code = "asset.source_unstable"
ProjectNotFound Code = "project.not_found"
ProjectBadFile Code = "project.bad_file"
ProjectExists Code = "project.exists"
SceneIOParse Code = "sceneio.parse"
SceneIOVersion Code = "sceneio.version"
SceneIOStrict Code = "sceneio.strict"
SceneIOMigrate Code = "sceneio.migrate"
BuildFailed Code = "build.failed"
UIBadLayout Code = "ui.bad_layout"
EditorHistory Code = "editor.history"
EditorProps Code = "editor.props"
EditorCommand Code = "editor.command"
RenderTarget Code = "render.target"
)
type Error struct {
Code Code
Msg string
Cause error
Fields []log.Field
}
func New(code Code, msg string, fields ...log.Field) *Error {
return &Error{Code: code, Msg: msg, Fields: fields}
}
func Wrap(err error, code Code, msg string) *Error {
return &Error{Code: code, Msg: msg, Cause: err}
}
func (e *Error) With(fields ...log.Field) *Error {
e.Fields = append(e.Fields, fields...)
return e
}
func (e *Error) Error() string {
var b strings.Builder
b.WriteString(string(e.Code))
if e.Msg != "" {
b.WriteString(": ")
b.WriteString(e.Msg)
}
for _, f := range e.Fields {
fmt.Fprintf(&b, " %s=%v", f.Key, f.Val)
}
if e.Cause != nil {
b.WriteString(": ")
b.WriteString(e.Cause.Error())
}
return b.String()
}
func (e *Error) Unwrap() error {
return e.Cause
}
func CodeOf(err error) Code {
var e *Error
if errors.As(err, &e) {
return e.Code
}
return ""
}
func Has(err error, code Code) bool {
for err != nil {
if e, ok := err.(*Error); ok && e.Code == code {
return true
}
err = errors.Unwrap(err)
}
return false
}