Errs module

master
dev 9 months ago
parent b91e6546af
commit 103c6d5555

@ -52,7 +52,6 @@ package main
import (
"errors"
"errs"
"fmt"
"os"
)
@ -77,10 +76,10 @@ func main() {
errs.AddMessage("Esto es mi mengage"),
errs.AddUser("usuarion_anonimo"),
errs.AddStack(),
errs.AddCauses(errs.Code("::error_cause")))
errs.AddCauses(errs.WithStack(errs.WithMessage(errs.Code("::error_cause"),"Esto es un mensaje %d ",3333))))
errs.NewTree(otro).Print(os.Stdout)
fmt.Printf("%#v\n", errs.NewTree(err))
}

@ -58,19 +58,23 @@ import (
const (
RootModule Module = Module("")
ErrsModule Module = Module("errs")
)
var (
var (
// Global sentinels (no module prefix)
ErrNilError = RootModule.Code("nil-error")
ErrNilCause = RootModule.Code("nil-cause")
ErrNilError = Code(RootModule + ModuleSep + "nil-error")
ErrNilCause = Code(RootModule + ModuleSep + "nil-cause")
// Internal sentinels (errs module)
ErrInvalidModule = ErrsModule.Code("invalid-module")
ErrInvalidCode = ErrsModule.Code("invalid-severity")
ErrInvalidMetaName = ErrsModule.Code("invalid-meta-name")
ErrInvalidParamName = ErrsModule.Code("invalid-param-name")
ErrInvalidModule = Code(ErrsModule + ModuleSep + "invalid-module")
ErrInvalidCode = Code(ErrsModule + ModuleSep + "invalid-severity")
ErrInvalidMetaName = Code(ErrsModule + ModuleSep + "invalid-meta-name")
ErrInvalidParamName = Code(ErrsModule + ModuleSep + "invalid-param-name")
paramRgx = regexp.MustCompile(`^[a-zA-Z][a-zA-Z0-9_]{0,62}[a-zA-Z0-9]$`)
metaRgx = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_-]{0,62}[a-zA-Z0-9_]$`)

File diff suppressed because it is too large Load Diff

@ -50,9 +50,7 @@
package errs
type Collector interface {
Options() CollectorFlags
AddMetas(meta ...Meta)
AddMetas (meta ...Meta)
AddCauses(causes ...error)
AddStack(stack Stack)
AddStack (stack Stack)
}

@ -103,8 +103,4 @@ func (w MultiError) Unwrap() []error { return w.ErrorList }
func (w MultiError) Name() string { return MetaCauseName }
func (w MultiError) Value() any { return w.ErrorList }
func (w MultiError) Collect(collector Collector) {
if collector.Options().HasCauses() {
collector.AddCauses(w.ErrorList...)
}
}
func (w MultiError) Collect(collector Collector) { collector.AddCauses(w.ErrorList...) }

@ -69,8 +69,4 @@ func (c PanicError) Unwrap() error { return c.cause }
func (c PanicError) Cause() error { return c.cause }
func (c PanicError) Collect(collector Collector) {
if collector.Options().HasCauses() {
collector.AddCauses(c.Cause())
}
}
func (c PanicError) Collect(collector Collector) { collector.AddCauses(c.Cause()) }

@ -112,9 +112,8 @@ func (e ParamError) Param() string { return e.param }
func (e ParamError) Value() any { return e.value }
func (e ParamError) Collect(collector Collector) {
if collector.Options().HasMetas() {
collector.AddMetas(
MakeMeta(MetaParamName, e.param),
MakeMeta(MetaParamValue, e.value))
}
collector.AddMetas(
MakeMeta(MetaParamName, e.param),
MakeMeta(MetaParamValue, e.value))
}

@ -60,8 +60,7 @@ const MaxDeep = 32
type (
Tree struct {
flags CollectorFlags
maxDeep int
options treeOptions
level int
Err error
@ -74,19 +73,21 @@ type (
)
func NewTree(err error, ops ...TreeFnc) *Tree {
return newTree(err, 0)
return newTree(err, 0, treeOptions{
maxDepth : MaxDeep,
stackStrategy: StackStrategyTop,
})
}
func newTree(err error, level int) *Tree {
func newTree(err error, level int, ops treeOptions) *Tree {
if err == nil || (level > MaxDeep) {
return nil
}
node := &Tree{
Err: err,
level: level,
maxDeep: MaxDeep,
flags: CollectorFlagsAll,
options : ops,
Err : err,
level : level,
}
for e := err; e != nil; {
@ -99,9 +100,6 @@ func newTree(err error, level int) *Tree {
return node
}
func (t *Tree) Options() CollectorFlags { return t.flags }
func (t *Tree) MaxDeep() int { return t.maxDeep }
// AddStack stores the first captured stack trace.
//
@ -109,14 +107,27 @@ func (t *Tree) MaxDeep() int { return t.maxDeep }
// This enforces a single authoritative stack trace per error,
// avoiding noise and preserving a clear origin.
func (t *Tree) AddStack(stack Stack) {
t.Stack = stack
t.flags = t.flags.Del(CollectorFlagStack)
if stack == nil || t.options.stackStrategy == StackStrategyNone {
return
}
if t.flags.HasStack() {
t.Stack = stack
t.flags = t.flags.Del(CollectorFlagStack)
}
}
func (t *Tree) AddMetas(metas ...Meta) {
if len(metas) == 0 || t.options.maxMetaDepth == -1 || t.level > t.options.maxMetaDepth {
return
}
t.Metas = append(t.Metas, metas...)
}
func (t *Tree) AddMetas(meta ...Meta) { t.Metas = append(t.Metas, meta...) }
func (t *Tree) AddCauses(causes ...error) {
if !t.flags.HasCauses() {
if len(causes) > 0 || t.options.maxDepth == -1 || t.level > t.options.maxDepth {
return
}
for _, cause := range causes {

@ -0,0 +1,67 @@
/* ——————————————————————————————————————————————————————————————————————————
Proyecto FWS
—————————————————————————————————————————————————————————————————————————————
Fichero tree_options.go
Package errs
Autor Juan V. Navarro juanvnl@activething.com
Creado 23/01/2026
—————————————————————————————————————————————————————————————————————————————
LICENSES AND TERMS OF USE
-------------------------
This software is licensed under the Elastic License v2.0 (the "License").
For full terms and additional information regarding permitted and prohibited
uses, please visit:
https://activething.com/ATGO/licenses
You may use, copy, modify, and redistribute this software internally within
your organization for any purpose, including research, development, and
testing, subject to the terms of this License.
You may NOT, however, use, provide, distribute, or make this software
available to any third party as part of a hosted service, SaaS offering, or
commercial product without first obtaining a commercial license from
Active Thing.
You may combine this software with other code, provided that such
combination does not circumvent the restrictions of this License.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. In no event shall
the authors or copyright holders be liable for any claim, damages, or other
liability arising from the use of this software.
—————————————————————————————————————————————————————————————————————————————
Web : activething.com | activething.com/FWS
git : g.activething.com | github.com/activething/FWS
Correo : dev@activething.com
—————————————————————————————————————————————————————————————————————————————
No deseo caminar sobre el agua", dijo Siddhartha.
Que los antiguos chamanes se contenten con tales habilidades.
—— Hermann Hesse, Siddhartha
—————————————————————————————————————————————————————————————————————————————
Copyright (c) 2026 Active Thing
————————————————————————————————————————————————————————————————————————————— */
package errs
const (
StackStrategyNone uint8 = iota
StackStrategyTop // Solo el primer stack encontrado
StackStrategyRoot // Solo el último stack (el más profundo)
StackStrategyAll
)
type (
treeOptions struct {
maxDepth int
maxMetaDepth int
maxStackDepth int
stackStrategy uint8
}
)

@ -83,8 +83,4 @@ func (w withCause) Unwrap() error { return w.error }
func (w withCause) Cause() error { return w.cause }
func (w withCause) Collect(c Collector) {
if c.Options().HasCauses() {
c.AddCauses(w.cause)
}
}
func (w withCause) Collect(c Collector) { c.AddCauses(w.cause) }

@ -156,8 +156,4 @@ func (w withCauses) Unwrap() error {
//
// Cause collection is explicit and opt-in, reinforcing the idea that
// causality is not part of the implicit unwrap traversal.
func (w withCauses) Collect(c Collector) {
if c.Options().HasCauses() && len(w.causes) > 0 {
c.AddCauses(w.causes...)
}
}
func (w withCauses) Collect(c Collector) { c.AddCauses(w.causes...) }

@ -84,8 +84,4 @@ func (w withDate) Date() time.Time { return w.date }
func (w withDate) Name() string { return MetaDateName }
func (w withDate) Value() any { return w.date }
func (w withDate) Collect(c Collector) {
if c.Options().HasMetas() {
c.AddMetas(w)
}
}
func (w withDate) Collect(c Collector) { c.AddMetas(w) }

@ -92,7 +92,7 @@ func (w withInfo) Link() string { return w.link }
func (w withInfo) Unwrap() error { return w.error }
func (w withInfo) Collect(collector Collector) {
if collector.Options().HasMetas() {
if collector.Options().HasEmpty() {
collector.AddMetas(
MakeMeta(MetaInfoDescName, w.desc),
@ -109,5 +109,4 @@ func (w withInfo) Collect(collector Collector) {
if len(w.link) > 0 {
collector.AddMetas(MakeMeta(MetaInfoLinkName, w.link))
}
}
}

@ -86,8 +86,4 @@ func (w withMessage) Message() string { return w.message }
func (w withMessage) Name() string { return MetaMessageName }
func (w withMessage) Value() any { return w.message }
func (w withMessage) Collect(collector Collector) {
if collector.Options().HasMetas() && (len(w.message) > 0 || collector.Options().HasEmpty()) {
collector.AddMetas(w)
}
}
func (w withMessage) Collect(collector Collector) { collector.AddMetas(w) }

@ -77,8 +77,4 @@ func (w withMetas) Unwrap() error {
return w.error
}
func (w withMetas) Collect(collector Collector) {
if collector.Options().HasMetas() {
collector.AddMetas(w.metas...)
}
}
func (w withMetas) Collect(collector Collector) { collector.AddMetas(w.metas...) }

@ -90,18 +90,16 @@ func (w withObserved) Instance() string { return w.instance }
func (w withObserved) Unwrap() error { return w.error }
func (w withObserved) Collect(collector Collector) {
if collector.Options().HasMetas() {
if collector.Options().HasEmpty() {
collector.AddMetas(
MakeMeta(MetaObservedObserverName, w.observer),
MakeMeta(MetaObservedInstanceName, w.instance))
return
}
if len(w.observer) > 0 {
collector.AddMetas(MakeMeta(MetaObservedObserverName, w.observer))
if len(w.instance) > 0 {
collector.AddMetas(MakeMeta(MetaObservedInstanceName, w.instance))
}
if collector.Options().HasEmpty() {
collector.AddMetas(
MakeMeta(MetaObservedObserverName, w.observer),
MakeMeta(MetaObservedInstanceName, w.instance))
return
}
if len(w.observer) > 0 {
collector.AddMetas(MakeMeta(MetaObservedObserverName, w.observer))
if len(w.instance) > 0 {
collector.AddMetas(MakeMeta(MetaObservedInstanceName, w.instance))
}
}
}

@ -94,26 +94,26 @@ func (w withOrigin) Instance() string { return w.instance }
func (w withOrigin) Unwrap() error { return w.error }
func (w withOrigin) Collect(collector Collector) {
if collector.Options().HasMetas() {
if collector.Options().HasEmpty() {
collector.AddMetas(
MakeMeta(MetaOriginClusterName, w.cluster),
MakeMeta(MetaOriginServerName, w.server),
MakeMeta(MetaOriginServiceName, w.service),
MakeMeta(MetaOriginInstanceName, w.instance))
return
}
if len(w.cluster) > 0 {
collector.AddMetas(MakeMeta(MetaOriginClusterName, w.cluster))
}
if len(w.server) > 0 {
collector.AddMetas(MakeMeta(MetaOriginServerName, w.server))
}
if len(w.service) > 0 {
collector.AddMetas(MakeMeta(MetaOriginServiceName, w.service))
}
if len(w.instance) > 0 {
collector.AddMetas(MakeMeta(MetaOriginInstanceName, w.instance))
}
if collector.Options().HasEmpty() {
collector.AddMetas(
MakeMeta(MetaOriginClusterName, w.cluster),
MakeMeta(MetaOriginServerName, w.server),
MakeMeta(MetaOriginServiceName, w.service),
MakeMeta(MetaOriginInstanceName, w.instance))
return
}
if len(w.cluster) > 0 {
collector.AddMetas(MakeMeta(MetaOriginClusterName, w.cluster))
}
if len(w.server) > 0 {
collector.AddMetas(MakeMeta(MetaOriginServerName, w.server))
}
if len(w.service) > 0 {
collector.AddMetas(MakeMeta(MetaOriginServiceName, w.service))
}
if len(w.instance) > 0 {
collector.AddMetas(MakeMeta(MetaOriginInstanceName, w.instance))
}
}

@ -125,14 +125,11 @@ func (w withRetry) After() time.Duration {
func (w withRetry) Unwrap() error { return w.error }
func (w withRetry) Collect(collector Collector) {
if collector.Options().HasMetas() {
collector.AddMetas(
MakeMeta(MetaRetryEnabledName, w.CanRetry()),
MakeMeta(MetaRetryTemporaryName, w.IsTemporary()),
MakeMeta(MetaRetryIdempotentName, w.IsIdempotent()))
if dur := w.After(); dur != -1 {
collector.AddMetas(MakeMeta(MetaRetryAfterName, dur))
}
return
collector.AddMetas(
MakeMeta(MetaRetryEnabledName, w.CanRetry()),
MakeMeta(MetaRetryTemporaryName, w.IsTemporary()),
MakeMeta(MetaRetryIdempotentName, w.IsIdempotent()))
if dur := w.After(); dur != -1 {
collector.AddMetas(MakeMeta(MetaRetryAfterName, dur))
}
}

@ -49,8 +49,6 @@
package errs
import "fmt"
const MetaSeverityName = "severity"
type withSeverity struct {
@ -80,9 +78,4 @@ func (w withSeverity) Value() any { return w.severity }
func (w withSeverity) Unwrap() error { return w.error }
func (w withSeverity) Collect(collector Collector) {
fmt.Printf("%v\n", collector.Options())
if collector.Options().HasMetas() {
collector.AddMetas(w)
}
}
func (w withSeverity) Collect(collector Collector) { collector.AddMetas(w) }

@ -89,8 +89,4 @@ func (w withStack) Unwrap() error {
func (w withStack) Name() string { return MetaStackName }
func (w withStack) Value() any { return w.stack }
func (w withStack) Collect(collector Collector) {
if collector.Options().HasStack() {
collector.AddStack(w.stack)
}
}
func (w withStack) Collect(collector Collector) { collector.AddStack(w.stack) }

@ -77,8 +77,4 @@ func (w withStatus) Status() int { return w.status }
func (w withStatus) Name() string { return MetaStatusName }
func (w withStatus) Value() any { return w.status }
func (w withStatus) Collect(collector Collector) {
if collector.Options().HasMetas() {
collector.AddMetas(w)
}
}
func (w withStatus) Collect(collector Collector) { collector.AddMetas(w) }

@ -81,8 +81,4 @@ func (w withUser) User() string { return w.user }
func (w withUser) Name() string { return MetaUserName }
func (w withUser) Value() any { return w.user }
func (w withUser) Collect(collector Collector) {
if collector.Options().HasMetas() {
collector.AddMetas(w)
}
}
func (w withUser) Collect(collector Collector) { collector.AddMetas(w) }

Loading…
Cancel
Save

Powered by TurnKey Linux.