commit
b91e6546af
@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="Go" enabled="true" />
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
<component name="ProjectDictionaryState">
|
||||||
|
<dictionary name="project">
|
||||||
|
<words>
|
||||||
|
<w>segs</w>
|
||||||
|
</words>
|
||||||
|
</dictionary>
|
||||||
|
</component>
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/FWS.iml" filepath="$PROJECT_DIR$/.idea/FWS.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
module apperrs
|
||||||
|
|
||||||
|
go 1.25
|
||||||
@ -0,0 +1,86 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero main.go
|
||||||
|
Package apperrs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 07/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 main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"errs"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
baseErr := errs.Code("auth::err_auth")
|
||||||
|
|
||||||
|
err := errs.WithMessage(
|
||||||
|
errs.WithCause(
|
||||||
|
errs.WithSeverity(
|
||||||
|
errs.WithStack(baseErr),
|
||||||
|
errs.SeverityCritical,
|
||||||
|
),
|
||||||
|
errors.New("db error"),
|
||||||
|
),
|
||||||
|
"authentication failed",
|
||||||
|
)
|
||||||
|
|
||||||
|
errs.NewTree(err).Print(os.Stdout)
|
||||||
|
|
||||||
|
otro := errs.Add(
|
||||||
|
errs.Code("::Mi_otro_error"),
|
||||||
|
errs.AddMessage("Esto es mi mengage"),
|
||||||
|
errs.AddUser("usuarion_anonimo"),
|
||||||
|
errs.AddStack(),
|
||||||
|
errs.AddCauses(errs.Code("::error_cause")))
|
||||||
|
|
||||||
|
errs.NewTree(otro).Print(os.Stdout)
|
||||||
|
|
||||||
|
fmt.Printf("%#v\n", errs.NewTree(err))
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,141 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero a.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 06/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 severity, 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
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
RootModule Module = Module("")
|
||||||
|
ErrsModule Module = Module("errs")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
|
||||||
|
// Global sentinels (no module prefix)
|
||||||
|
ErrNilError = RootModule.Code("nil-error")
|
||||||
|
ErrNilCause = RootModule.Code("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")
|
||||||
|
|
||||||
|
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_]$`)
|
||||||
|
codeRgx = regexp.MustCompile(`^[a-zA-Z0-9](?:[a-zA-Z0-9_-]*[a-zA-Z0-9])?$`)
|
||||||
|
severityName = []string{"UNKNOWN", "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL", "FATAL"}
|
||||||
|
)
|
||||||
|
|
||||||
|
func isValidSegment(code string) bool { return len(code) > 0 && codeRgx.MatchString(code) }
|
||||||
|
|
||||||
|
func ToError(err any) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
switch t := err.(type) {
|
||||||
|
case error:
|
||||||
|
return t
|
||||||
|
case []error:
|
||||||
|
return MakeMultiError(t)
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("%v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ToString(err error) string {
|
||||||
|
if err == nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
switch e := err.(type) {
|
||||||
|
case Code:
|
||||||
|
return string(e)
|
||||||
|
case *Code:
|
||||||
|
return string(*e)
|
||||||
|
case fmt.Stringer:
|
||||||
|
return e.String()
|
||||||
|
default:
|
||||||
|
return err.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Matches(err, target error) bool {
|
||||||
|
var t Code
|
||||||
|
if !errors.As(target, &t) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Itera por toda la cadena de unwrap
|
||||||
|
for e := err; e != nil; e = errors.Unwrap(e) {
|
||||||
|
var c Code
|
||||||
|
if errors.As(e, &c) && c.IsOrFrom(t) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsSubOf(parent, err error) bool {
|
||||||
|
var p Code
|
||||||
|
if !errors.As(parent, &p) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
for e := err; e != nil; e = errors.Unwrap(e) {
|
||||||
|
var c Code
|
||||||
|
if errors.As(e, &c) && c.IsSubOf(p) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
@ -0,0 +1,80 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero adder.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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
|
||||||
|
|
||||||
|
type (
|
||||||
|
Adder interface {
|
||||||
|
Add(err error) error
|
||||||
|
}
|
||||||
|
|
||||||
|
AddFnc func(err error) error
|
||||||
|
)
|
||||||
|
|
||||||
|
func (f AddFnc) Add(err error) error { return f(err) }
|
||||||
|
|
||||||
|
func Add(base error, composers ...Adder) error {
|
||||||
|
if base == nil {
|
||||||
|
// Panics with a specific error if the base error is nil, indicating incorrect usage.
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
if len(composers) == 0 {
|
||||||
|
return base
|
||||||
|
}
|
||||||
|
// Apply each composer sequentially.
|
||||||
|
for _, c := range composers {
|
||||||
|
if c != nil {
|
||||||
|
// If the composer returns a new non-nil error, update the base error.
|
||||||
|
if nb := c.Add(base); nb != nil {
|
||||||
|
base = nb
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return base
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,54 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero causer.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 15/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 severity, 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
|
||||||
|
|
||||||
|
type Causer interface {
|
||||||
|
Cause() error
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero causers.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 15/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 severity, 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
|
||||||
|
|
||||||
|
type Causers interface {
|
||||||
|
Causes() []error
|
||||||
|
}
|
||||||
@ -0,0 +1,138 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero severity.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 03/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 severity, 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
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Code string
|
||||||
|
|
||||||
|
func (c Code) Sub(newCode string) Code { return makeCode(string(c), CodeSep, newCode) }
|
||||||
|
|
||||||
|
func (c Code) Module() Module {
|
||||||
|
s := string(c)
|
||||||
|
if i := strings.Index(s, ModuleSep); i != -1 {
|
||||||
|
return Module(s[:i])
|
||||||
|
}
|
||||||
|
return RootModule
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) Leaf() string {
|
||||||
|
s := string(c)
|
||||||
|
if i := strings.LastIndex(s, CodeSep); i >= 0 {
|
||||||
|
return string(c[i+lenCodeSep:])
|
||||||
|
}
|
||||||
|
if i := strings.Index(s, ModuleSep); i != -1 {
|
||||||
|
return s[i+lenModuleSep:]
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) Parent() Code {
|
||||||
|
if i := strings.LastIndex(string(c), CodeSep); i >= 0 {
|
||||||
|
return c[:i]
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) Segs() []string {
|
||||||
|
s := string(c)
|
||||||
|
n := len(s)
|
||||||
|
var segments []string
|
||||||
|
|
||||||
|
// encontrar módulo
|
||||||
|
moduleEnd := strings.Index(s, ModuleSep)
|
||||||
|
if moduleEnd == -1 || moduleEnd+lenModuleSep >= n {
|
||||||
|
return []string{s} // solo módulo o cadena simple
|
||||||
|
}
|
||||||
|
segments = append(segments, s[:moduleEnd])
|
||||||
|
// iterar sobre el resto de la cadena
|
||||||
|
start := moduleEnd + lenModuleSep
|
||||||
|
for i := start; i <= n; i++ {
|
||||||
|
if i == n || s[i] == CodeSep[0] {
|
||||||
|
segments = append(segments, s[start:i])
|
||||||
|
start = i + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return segments
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) IsSubOf(parent error) bool {
|
||||||
|
var p Code
|
||||||
|
if !errors.As(parent, &p) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
s, ps := string(c), string(p)
|
||||||
|
if s == ps {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return strings.HasPrefix(s, ps+CodeSep)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) Is(target error) bool {
|
||||||
|
var t Code
|
||||||
|
return errors.As(target, &t) && c == t
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) IsOrFrom(target error) bool {
|
||||||
|
var t Code
|
||||||
|
if !errors.As(target, &t) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
sc := string(c)
|
||||||
|
st := string(t)
|
||||||
|
return sc == st || strings.HasPrefix(sc, st+CodeSep)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Code) Error() string { return string(c) }
|
||||||
|
|
||||||
|
func (c Code) String() string { return string(c) }
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero collectable.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 20/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
|
||||||
|
|
||||||
|
type (
|
||||||
|
Collectable interface {
|
||||||
|
Collect(collector Collector)
|
||||||
|
}
|
||||||
|
|
||||||
|
CollectFnc func(collector Collector)
|
||||||
|
)
|
||||||
|
|
||||||
|
func (f CollectFnc) Collect(collector Collector) { f(collector) }
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero collector.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 20/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
|
||||||
|
|
||||||
|
type Collector interface {
|
||||||
|
Options() CollectorFlags
|
||||||
|
|
||||||
|
AddMetas(meta ...Meta)
|
||||||
|
AddCauses(causes ...error)
|
||||||
|
AddStack(stack Stack)
|
||||||
|
}
|
||||||
@ -0,0 +1,79 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero meta_filter.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 15/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 severity, 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 (
|
||||||
|
CollectorFlagMetas CollectorFlags = 1 << iota
|
||||||
|
CollectorFlagCauses
|
||||||
|
CollectorFlagStack
|
||||||
|
|
||||||
|
CollectorFlagEmpty
|
||||||
|
CollectorFlagsAll = (1 << iota) - 1
|
||||||
|
)
|
||||||
|
|
||||||
|
// CollectorOptss is a bitmask type used to select which types of metadata to retrieve.
|
||||||
|
type CollectorFlags uint8
|
||||||
|
|
||||||
|
// CanAcceptMetas returns true if the CollectorOptss includes the MetaFilterField flag.
|
||||||
|
func (s CollectorFlags) HasMetas() bool { return s&CollectorFlagMetas != 0 }
|
||||||
|
|
||||||
|
// HasCauses returns true if the CollectorOptss includes the MetaFilterCause flag.
|
||||||
|
func (s CollectorFlags) HasCauses() bool { return s&CollectorFlagCauses != 0 }
|
||||||
|
|
||||||
|
// HasStack returns true if the CollectorOptss includes the MetaFilterStack flag.
|
||||||
|
func (s CollectorFlags) HasStack() bool { return s&CollectorFlagStack != 0 }
|
||||||
|
|
||||||
|
func (s CollectorFlags) HasEmpty() bool { return s&CollectorFlagEmpty != 0 }
|
||||||
|
|
||||||
|
func (s CollectorFlags) Can(flag CollectorFlags) bool { return s&flag != 0 }
|
||||||
|
|
||||||
|
func (s CollectorFlags) Del(flag CollectorFlags) CollectorFlags { return s &^ flag }
|
||||||
|
|
||||||
|
func (s CollectorFlags) Add(flag CollectorFlags) CollectorFlags { return s | flag }
|
||||||
@ -0,0 +1,122 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero error_list.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 09/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 severity, 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
|
||||||
|
|
||||||
|
type ErrorList []error
|
||||||
|
|
||||||
|
func (l ErrorList) Any() bool {
|
||||||
|
for _, e := range l {
|
||||||
|
if e != nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l ErrorList) Count() int {
|
||||||
|
c := 0
|
||||||
|
for _, e := range l {
|
||||||
|
if e != nil {
|
||||||
|
c++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l ErrorList) First() error {
|
||||||
|
for _, e := range l {
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l ErrorList) Last() error {
|
||||||
|
for i := len(l) - 1; i >= 0; i-- {
|
||||||
|
if l[i] != nil {
|
||||||
|
return l[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l ErrorList) Append(err error) ErrorList {
|
||||||
|
return append(l, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppendNotNil adds an error to the list only if it's not nil.
|
||||||
|
// Returns the modified error list or the original list if the error was nil.
|
||||||
|
func (l ErrorList) AppendNotNil(err error) ErrorList {
|
||||||
|
if err != nil {
|
||||||
|
return append(l, err)
|
||||||
|
}
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l ErrorList) Reset() ErrorList {
|
||||||
|
return l[:0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l ErrorList) filter(filter func(error) bool) ErrorList {
|
||||||
|
rs := make([]error, 0, len(l))
|
||||||
|
for _, e := range l {
|
||||||
|
if filter(e) {
|
||||||
|
rs = append(rs, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l ErrorList) Clean() ErrorList {
|
||||||
|
return l.filter(func(e error) bool {
|
||||||
|
return e != nil
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero format.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 19/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
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func format(w io.Writer, err error, level int, ops FormatOptions) error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
//todo
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@ -0,0 +1,171 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero format_flags.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 19/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
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// FormatShowHierarchy is a flag to show the error hierarchy (wrapped errors/causes).
|
||||||
|
FormatShowHierarchy FormatterFlags = 1 << iota
|
||||||
|
|
||||||
|
// FormatShowMetas is a flag to show metadata of the current error in the hierarchy.
|
||||||
|
FormatShowMetas
|
||||||
|
|
||||||
|
// FormatShowDeepMetas is a flag to show metadata for all errors in the hierarchy.
|
||||||
|
FormatShowDeepMetas
|
||||||
|
|
||||||
|
// FormatShowStack is a flag to show the stack trace of the root error.
|
||||||
|
FormatShowStack
|
||||||
|
|
||||||
|
// FormatShowDeepStacks is a flag to show stack traces for all errors in the hierarchy if defined.
|
||||||
|
FormatShowDeepStacks
|
||||||
|
|
||||||
|
// FormatShowAll is a convenience flag to show everything.
|
||||||
|
FormatShowAll = (1 << iota) - 1
|
||||||
|
|
||||||
|
// FormatShowNone is a flag to show nothing extra (only the basic error message).
|
||||||
|
FormatShowNone FormatterFlags = 0
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// FormatterFlags is a bitmask type used to control which parts of an error are displayed during formatting.
|
||||||
|
FormatterFlags uint8
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasMetas returns true if the FormatterFlags includes the FormatShowMetas flag.
|
||||||
|
func (o FormatterFlags) HasMetas() bool { return o&FormatShowMetas != 0 }
|
||||||
|
|
||||||
|
// HasHierarchy returns true if the FormatterFlags includes the FormatShowHierarchy flag.
|
||||||
|
func (o FormatterFlags) HasHierarchy() bool { return o&FormatShowHierarchy != 0 }
|
||||||
|
|
||||||
|
// HasDeepMetas returns true if the FormatterFlags includes the FormatShowDeepMetas flag.
|
||||||
|
func (o FormatterFlags) HasDeepMetas() bool { return o&FormatShowDeepMetas != 0 }
|
||||||
|
|
||||||
|
// HasStack returns true if the FormatterFlags includes the FormatShowStack flag.
|
||||||
|
func (o FormatterFlags) HasStack() bool { return o&FormatShowStack != 0 }
|
||||||
|
|
||||||
|
// HasDeepStacks returns true if the FormatterFlags includes the FormatShowDeepStacks flag.
|
||||||
|
func (o FormatterFlags) HasDeepStacks() bool { return o&FormatShowDeepStacks != 0 }
|
||||||
|
|
||||||
|
func (o FormatterFlags) IsDeepMode() bool { return o.HasDeepMetas() || o.HasDeepStacks() }
|
||||||
|
|
||||||
|
func (o FormatterFlags) IsMinimal() bool { return o == FormatShowNone }
|
||||||
|
|
||||||
|
func (o FormatterFlags) Normalize() FormatterFlags {
|
||||||
|
// Si HasDeepMetas está activo, HasMetas también debería estarlo
|
||||||
|
if o.HasDeepMetas() {
|
||||||
|
o |= FormatShowMetas
|
||||||
|
}
|
||||||
|
if o.HasDeepStacks() {
|
||||||
|
o |= FormatShowStack
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
// String returns a human-readable representation of the FormatterFlags flags.
|
||||||
|
func (o FormatterFlags) String() string {
|
||||||
|
if o == FormatShowNone {
|
||||||
|
return "none"
|
||||||
|
}
|
||||||
|
var parts []string
|
||||||
|
if o.HasHierarchy() {
|
||||||
|
parts = append(parts, "hierarchy")
|
||||||
|
}
|
||||||
|
if o.HasMetas() {
|
||||||
|
if o.HasDeepMetas() {
|
||||||
|
parts = append(parts, "deep-metas")
|
||||||
|
} else {
|
||||||
|
parts = append(parts, "metas")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if o.HasStack() {
|
||||||
|
if o.HasDeepStacks() {
|
||||||
|
parts = append(parts, "deep-stacks")
|
||||||
|
} else {
|
||||||
|
parts = append(parts, "stack")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Join(parts, "|")
|
||||||
|
}
|
||||||
|
|
||||||
|
// FormatFlagsFromVerb derives FormatterFlags flags based on the fmt.State and verb.
|
||||||
|
// This function interprets standard fmt verbs and flags to determine what to display.
|
||||||
|
func FormatFlagsFromVerb(f fmt.State, verb rune) FormatterFlags {
|
||||||
|
s := FormatShowNone
|
||||||
|
switch verb {
|
||||||
|
case 'v':
|
||||||
|
// For %v, check flags to determine what to show.
|
||||||
|
if f.Flag('+') {
|
||||||
|
// %+v -> Show hierarchy, metas, and full stack
|
||||||
|
s = FormatShowAll
|
||||||
|
} else if f.Flag('#') {
|
||||||
|
// %#v -> Show metas and stack of the principal error
|
||||||
|
s |= FormatShowMetas | FormatShowStack
|
||||||
|
} else if f.Flag('-') {
|
||||||
|
s |= FormatShowHierarchy | FormatShowMetas
|
||||||
|
} else {
|
||||||
|
// %v -> Show hierarchy and principal stack (optional based on your criterion)
|
||||||
|
s |= FormatShowHierarchy | FormatShowStack
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
case 's', 'q':
|
||||||
|
case 'd', 'o', 'x', 'X':
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
return s.Normalize()
|
||||||
|
}
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero format_options.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 19/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
|
||||||
|
|
||||||
|
type (
|
||||||
|
FormatOptions struct {
|
||||||
|
Flags FormatterFlags
|
||||||
|
EnableColor bool
|
||||||
|
Indent string
|
||||||
|
|
||||||
|
FmtError string
|
||||||
|
FmtMeta string
|
||||||
|
FmtCause string
|
||||||
|
FmtStackHead string
|
||||||
|
FmtStackLine string
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewFormatOptions() *FormatOptions {
|
||||||
|
return &FormatOptions{
|
||||||
|
Indent: " ",
|
||||||
|
FmtError: "%s%s\n",
|
||||||
|
FmtMeta: "%s * %s: %v\n",
|
||||||
|
FmtCause: "%s%s\n",
|
||||||
|
FmtStackHead: "%s * stack:\n",
|
||||||
|
FmtStackLine: "%s %s\n",
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero formatter.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 19/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
|
||||||
|
|
||||||
|
import "io"
|
||||||
|
|
||||||
|
type (
|
||||||
|
Formatter interface {
|
||||||
|
Format(writer io.Writer, err error) error
|
||||||
|
}
|
||||||
|
|
||||||
|
FormatFnc func(writer io.Writer, err error) error
|
||||||
|
)
|
||||||
|
|
||||||
|
func (f FormatFnc) Format(writer io.Writer, err error) error { return f(writer, err) }
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
module errs
|
||||||
|
|
||||||
|
go 1.25
|
||||||
@ -0,0 +1,78 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero meta.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 15/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 severity, 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
|
||||||
|
|
||||||
|
type Meta interface {
|
||||||
|
Name() string
|
||||||
|
Value() any
|
||||||
|
}
|
||||||
|
|
||||||
|
type meta struct {
|
||||||
|
name string
|
||||||
|
value any
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeMeta(name string, value any) Meta {
|
||||||
|
if len(name) == 0 || !metaRgx.MatchString(name) {
|
||||||
|
panic(MakePanicError(ErrInvalidMetaName))
|
||||||
|
}
|
||||||
|
return &meta{
|
||||||
|
name: name,
|
||||||
|
value: value,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m meta) Name() string { return m.name }
|
||||||
|
|
||||||
|
func (m meta) Value() any { return m.value }
|
||||||
|
|
||||||
|
func IsValidMetaName(meta string) bool {
|
||||||
|
return len(meta) > 0 && metaRgx.MatchString(meta)
|
||||||
|
}
|
||||||
@ -0,0 +1,77 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero module.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 06/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 severity, 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 (
|
||||||
|
CodeSep = "."
|
||||||
|
ModuleSep = "::"
|
||||||
|
lenModuleSep = 2
|
||||||
|
lenCodeSep = 1
|
||||||
|
)
|
||||||
|
|
||||||
|
type Module string
|
||||||
|
|
||||||
|
func MakeModule(name string) Module {
|
||||||
|
if !isValidSegment(name) {
|
||||||
|
panic(ErrInvalidModule)
|
||||||
|
}
|
||||||
|
return Module(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m Module) Code(code string) Code { return makeCode(string(m), ModuleSep, code) }
|
||||||
|
|
||||||
|
func (m Module) String() string { return string(m) }
|
||||||
|
|
||||||
|
func makeCode(parent string, sep string, code string) Code {
|
||||||
|
if !isValidSegment(code) {
|
||||||
|
panic(ErrInvalidCode)
|
||||||
|
}
|
||||||
|
return Code(parent + sep + code)
|
||||||
|
}
|
||||||
@ -0,0 +1,110 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero multi_error.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 09/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 severity, 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
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
const CodeMultiError = Code(ModuleSep + "multi_error")
|
||||||
|
|
||||||
|
type MultiError struct {
|
||||||
|
Code
|
||||||
|
ErrorList
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeMultiError(causes ErrorList) MultiError {
|
||||||
|
return MultiError{
|
||||||
|
Code: CodeMultiError,
|
||||||
|
ErrorList: causes.Clean()}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FindIs encuentra el primer error en la lista para el que errors.Is devuelve true.
|
||||||
|
// Devuelve el error encontrado o nil si ninguno coincide.
|
||||||
|
//
|
||||||
|
// Ejemplo:
|
||||||
|
//
|
||||||
|
// if found := multi.FindIs(SomeCode); found != nil {
|
||||||
|
// fmt.Println("Encontrado error de esa categoría:", found)
|
||||||
|
// }
|
||||||
|
func (w MultiError) FindIs(target error) error {
|
||||||
|
for _, e := range w.ErrorList {
|
||||||
|
if errors.Is(e, target) {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w MultiError) Is(target error) bool { return w.FindIs(target) != nil || Matches(w, target) }
|
||||||
|
|
||||||
|
// FindAs encuentra el primer error en la lista que coincide con target.
|
||||||
|
// target debe ser un puntero a un tipo que implemente error o una interfaz.
|
||||||
|
// Devuelve el error encontrado o nil si no se encuentra.
|
||||||
|
func (w MultiError) FindAs(target any) error {
|
||||||
|
for _, err := range w.ErrorList {
|
||||||
|
if errors.As(err, target) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w MultiError) Unwrap() []error { return w.ErrorList }
|
||||||
|
|
||||||
|
// Meta interface implementación
|
||||||
|
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...)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero panic_error.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 08/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 severity, 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 (
|
||||||
|
CodePanic = Code(ModuleSep + "panic")
|
||||||
|
)
|
||||||
|
|
||||||
|
type PanicError struct {
|
||||||
|
Code
|
||||||
|
cause error
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakePanicError(cause any) PanicError {
|
||||||
|
return PanicError{
|
||||||
|
Code: CodePanic,
|
||||||
|
cause: ToError(cause),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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())
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,120 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero param_error.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 08/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 severity, 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 (
|
||||||
|
CodeParamError = Code(ModuleSep + "invalid_param")
|
||||||
|
CodeParamNilError = CodeParamError + CodeSep + "nil"
|
||||||
|
CodeParamEmptyError = CodeParamError + CodeSep + "empty"
|
||||||
|
CodeParamTypeError = CodeParamError + CodeSep + "invalid_type"
|
||||||
|
CodeParamFormatError = CodeParamError + CodeSep + "invalid_format"
|
||||||
|
CodeParamRangeError = CodeParamError + CodeSep + "range"
|
||||||
|
CodeParamRangeMinError = CodeParamRangeError + CodeSep + "min"
|
||||||
|
CodeParamRangeMaxError = CodeParamRangeError + CodeSep + "max"
|
||||||
|
|
||||||
|
MetaParamName = "param_name"
|
||||||
|
MetaParamValue = "param_value"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ParamError struct {
|
||||||
|
Code
|
||||||
|
param string
|
||||||
|
value any
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeParamError(param string, value any) ParamError {
|
||||||
|
if len(param) == 0 || !paramRgx.MatchString(param) {
|
||||||
|
panic(MakePanicError(ErrInvalidParamName))
|
||||||
|
}
|
||||||
|
return ParamError{
|
||||||
|
Code: CodeParamError,
|
||||||
|
param: param,
|
||||||
|
value: value}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeParamNilError(param string) ParamError {
|
||||||
|
return ParamError{Code: CodeParamNilError, param: param}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeParamEmptyError(param string) ParamError {
|
||||||
|
return ParamError{Code: CodeParamEmptyError, param: param}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeParamTypeError(param string) ParamError {
|
||||||
|
return ParamError{Code: CodeParamTypeError, param: param}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeParamFormatError(param string, value any) ParamError {
|
||||||
|
return ParamError{Code: CodeParamFormatError, param: param, value: value}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeParamRangeError(param string, value any) ParamError {
|
||||||
|
return ParamError{Code: CodeParamRangeError, param: param, value: value}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeParamRangeMinError(param string, value any) ParamError {
|
||||||
|
return ParamError{Code: CodeParamRangeMinError, param: param, value: value}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeParamRangeMaxError(param string, value any) ParamError {
|
||||||
|
return ParamError{Code: CodeParamRangeMaxError, param: param, value: value}
|
||||||
|
}
|
||||||
|
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,81 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero severity.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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 (
|
||||||
|
// SeverityDebug indicates a severity level for debugging information.
|
||||||
|
SeverityDebug Severity = 1 + iota
|
||||||
|
// SeverityInfo indicates a severity level for general information.
|
||||||
|
SeverityInfo
|
||||||
|
// SeverityWarn indicates a severity level for warnings.
|
||||||
|
SeverityWarn
|
||||||
|
// SeverityError indicates a severity level for errors affecting functionality.
|
||||||
|
SeverityError
|
||||||
|
// SeverityCritical indicates a severity level for critical errors requiring immediate attention.
|
||||||
|
SeverityCritical
|
||||||
|
// SeverityFatal indicates a severity level for errors causing application termination.
|
||||||
|
SeverityFatal
|
||||||
|
)
|
||||||
|
|
||||||
|
// Severity represents the severity level of an error.
|
||||||
|
// It is used to classify the importance of an error.
|
||||||
|
type Severity uint8
|
||||||
|
|
||||||
|
// String returns the string representation of the severity level.
|
||||||
|
// Returns "UNKNOWN" for undefined severity values.
|
||||||
|
func (s Severity) String() string {
|
||||||
|
// Checks if the severity value is within the expected range.
|
||||||
|
if s <= 0 || s > SeverityFatal {
|
||||||
|
return severityName[0]
|
||||||
|
}
|
||||||
|
// Uses a string slice to map the severity value to its name.
|
||||||
|
// Note: Index 0 is not used as severity values start from 1 (1 << 0).
|
||||||
|
return severityName[s]
|
||||||
|
}
|
||||||
@ -0,0 +1,113 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero stack.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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
|
||||||
|
|
||||||
|
import (
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Constants used for stack trace configuration and handling.
|
||||||
|
const (
|
||||||
|
// stackSkipFrames defines how many initial frames are skipped when capturing the stack.
|
||||||
|
// 2 frames are skipped to exclude internal system calls (runtime.Callers and this function).
|
||||||
|
stackSkipFrames = 2
|
||||||
|
|
||||||
|
// stackMaxFrames defines the maximum number of frames that will be captured.
|
||||||
|
// Limits the depth of the stack trace to 32 frames by default.
|
||||||
|
stackMaxFrames = 32
|
||||||
|
)
|
||||||
|
|
||||||
|
// Stack is a slice of program counters, representing a captured stack trace.
|
||||||
|
type Stack []uintptr
|
||||||
|
|
||||||
|
// CreateStack captures the current execution stack trace.
|
||||||
|
// It takes an offset (number of frames to skip in addition to the default)
|
||||||
|
// and maxFrames (maximum number of frames to capture).
|
||||||
|
// Returns a Stack slice containing the captured program counters.
|
||||||
|
func CreateStack(options ...int) Stack {
|
||||||
|
offset := 0
|
||||||
|
maxFrames := stackMaxFrames
|
||||||
|
if len(options) > 0 {
|
||||||
|
offset = options[0]
|
||||||
|
if offset < 0 {
|
||||||
|
offset = 0
|
||||||
|
}
|
||||||
|
if len(options) > 1 {
|
||||||
|
maxFrames = options[1]
|
||||||
|
if maxFrames < 0 || maxFrames > stackMaxFrames {
|
||||||
|
maxFrames = stackMaxFrames
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ls := make([]uintptr, maxFrames)
|
||||||
|
|
||||||
|
// Capture the stack trace using runtime.Callers.
|
||||||
|
// runtime.Callers fills the slice 'ls' with program counters,
|
||||||
|
// skipping 'offset + stackSkipFrames' frames.
|
||||||
|
// 'cn' will contain the actual number of frames captured.
|
||||||
|
cn := runtime.Callers(offset+stackSkipFrames, ls)
|
||||||
|
|
||||||
|
// Return only the slice containing valid program counters (up to 'cn').
|
||||||
|
return ls[:cn]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Frames converts the Stack (slice of program counters) into a slice of StackFrame objects.
|
||||||
|
// Each StackFrame provides detailed information about a single frame in the stack.
|
||||||
|
func (s Stack) Frames() []StackFrame {
|
||||||
|
// Create a slice to store StackFrame objects with the same length as the stack.
|
||||||
|
f := make([]StackFrame, len(s))
|
||||||
|
|
||||||
|
// Convert each program counter to a StackFrame object.
|
||||||
|
for i, p := range s {
|
||||||
|
f[i] = CreateStackFrame(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return f
|
||||||
|
}
|
||||||
@ -0,0 +1,165 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero stack_frame.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// stackUnknownInfo is the default value when information about a stack frame cannot be obtained.
|
||||||
|
stackUnknownInfo = "???"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
// StackFrame represents a single frame in a stack trace.
|
||||||
|
// It contains detailed information about the function call at that point.
|
||||||
|
StackFrame struct {
|
||||||
|
// LineNumber is the line number in the source file where this frame was created.
|
||||||
|
LineNumber int
|
||||||
|
|
||||||
|
// File is the full path to the source file containing this frame.
|
||||||
|
File string
|
||||||
|
|
||||||
|
// FuncName is the name of the function where this frame was created,
|
||||||
|
// with any receiver types removed.
|
||||||
|
FuncName string
|
||||||
|
|
||||||
|
// Package is the full package path where this frame was created.
|
||||||
|
Package string
|
||||||
|
|
||||||
|
// Counter is the program counter address for this frame.
|
||||||
|
Counter uintptr
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// CreateStackFrame creates a new StackFrame from a program counter address.
|
||||||
|
// It uses runtime information to populate the frame details.
|
||||||
|
// Returns an empty StackFrame if the counter is 0.
|
||||||
|
func CreateStackFrame(counter uintptr) StackFrame {
|
||||||
|
sf := StackFrame{}
|
||||||
|
if counter == 0 {
|
||||||
|
return sf
|
||||||
|
}
|
||||||
|
sf.Counter = counter
|
||||||
|
fn := runtime.FuncForPC(counter)
|
||||||
|
if fn == nil {
|
||||||
|
sf.FuncName = stackUnknownInfo
|
||||||
|
return sf
|
||||||
|
}
|
||||||
|
|
||||||
|
sf.Package, sf.FuncName = packageAndName(fn)
|
||||||
|
sf.File, sf.LineNumber = fn.FileLine(counter - 1)
|
||||||
|
return sf
|
||||||
|
}
|
||||||
|
|
||||||
|
// SourceLine attempts to retrieve the source severity line for this stack frame.
|
||||||
|
// It reads the source file and returns the content of the line specified by LineNumber.
|
||||||
|
// Returns stackUnknownInfo if the line number is invalid or an error occurs while reading the file.
|
||||||
|
func (f StackFrame) SourceLine() string {
|
||||||
|
if f.LineNumber <= 0 || f.File == "" {
|
||||||
|
return stackUnknownInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. Verificación rápida: ¿Existe el archivo?
|
||||||
|
// Evita intentar abrir archivos que no existen (común en Docker/Prod).
|
||||||
|
if _, err := os.Stat(f.File); os.IsNotExist(err) {
|
||||||
|
return "" // Retorna vacío silenciosamente en lugar de "???" para no ensuciar logs.
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Lectura segura
|
||||||
|
file, err := os.Open(f.File)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
defer func() { _ = file.Close() }()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
currentLine := 1
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
if currentLine == f.LineNumber {
|
||||||
|
return string(bytes.TrimSpace(scanner.Bytes()))
|
||||||
|
}
|
||||||
|
currentLine++
|
||||||
|
// Optimización: Si pasamos la línea, dejar de leer.
|
||||||
|
if currentLine > f.LineNumber {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stackUnknownInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
// packageAndName extracts the package path and function name from a runtime.Func.
|
||||||
|
// It handles different naming conventions, including methods.
|
||||||
|
func packageAndName(fn *runtime.Func) (string, string) {
|
||||||
|
nm := fn.Name() // Get the full name, e.g., "main.(*MyType).MyMethod" or "main.myFunction"
|
||||||
|
pg := "" // Initialize package path
|
||||||
|
|
||||||
|
// Find the last slash, which separates package path components.
|
||||||
|
if ls := strings.LastIndex(nm, "/"); ls >= 0 {
|
||||||
|
pg = nm[:ls] + "/" // Extract the path part
|
||||||
|
nm = nm[ls+1:] // Keep the rest of the name
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the first dot after the last slash, which separates package name from function name.
|
||||||
|
if pd := strings.Index(nm, "."); pd >= 0 {
|
||||||
|
pg += nm[:pd] // Add the package name to the path
|
||||||
|
nm = nm[pd+1:] // Keep the function name
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace the Go internal method separator '·' with '.' for readability.
|
||||||
|
return pg, strings.Replace(nm, "·", ".", -1)
|
||||||
|
}
|
||||||
@ -0,0 +1,204 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero tree.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 20/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
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const MaxDeep = 32
|
||||||
|
|
||||||
|
type (
|
||||||
|
Tree struct {
|
||||||
|
flags CollectorFlags
|
||||||
|
maxDeep int
|
||||||
|
level int
|
||||||
|
|
||||||
|
Err error
|
||||||
|
Causes []*Tree
|
||||||
|
Metas []Meta
|
||||||
|
Stack Stack
|
||||||
|
}
|
||||||
|
|
||||||
|
TreeFnc func(*Tree)
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewTree(err error, ops ...TreeFnc) *Tree {
|
||||||
|
return newTree(err, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTree(err error, level int) *Tree {
|
||||||
|
if err == nil || (level > MaxDeep) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
node := &Tree{
|
||||||
|
Err: err,
|
||||||
|
level: level,
|
||||||
|
maxDeep: MaxDeep,
|
||||||
|
flags: CollectorFlagsAll,
|
||||||
|
}
|
||||||
|
|
||||||
|
for e := err; e != nil; {
|
||||||
|
if c, ok := e.(Collectable); ok {
|
||||||
|
c.Collect(node)
|
||||||
|
}
|
||||||
|
e = errors.Unwrap(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
|
//
|
||||||
|
// Once a stack is set, further stack collection is disabled.
|
||||||
|
// 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tree) AddMetas(meta ...Meta) { t.Metas = append(t.Metas, meta...) }
|
||||||
|
|
||||||
|
func (t *Tree) AddCauses(causes ...error) {
|
||||||
|
if !t.flags.HasCauses() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, cause := range causes {
|
||||||
|
if cause == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if child := newTree(cause, t.level+1); child != nil {
|
||||||
|
t.Causes = append(t.Causes, child)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tree) print(w io.Writer, prefix string, isLast bool) {
|
||||||
|
marker := "├── "
|
||||||
|
if isLast {
|
||||||
|
marker = "└── "
|
||||||
|
if t.level == 0 {
|
||||||
|
marker = "─── "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Root error (use Error() for formatted)
|
||||||
|
fmt.Fprintf(w, "%s%s%v\n", prefix, marker, t.Err.Error()) // Use Error() not %v
|
||||||
|
|
||||||
|
childPrefix := prefix
|
||||||
|
if isLast {
|
||||||
|
childPrefix += " "
|
||||||
|
} else {
|
||||||
|
childPrefix += "│ "
|
||||||
|
}
|
||||||
|
|
||||||
|
// All Metas (current)
|
||||||
|
for i, meta := range t.Metas {
|
||||||
|
isLastMeta := i == len(t.Metas)-1 && len(t.Causes) == 0 && len(t.Stack) != 0
|
||||||
|
metaMarker := "├── "
|
||||||
|
if isLastMeta {
|
||||||
|
metaMarker = "└── "
|
||||||
|
}
|
||||||
|
fmt.Fprintf(w, "%s%s[%s: %v]\n", childPrefix, metaMarker, meta.Name(), meta.Value())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stack (current)
|
||||||
|
if len(t.Stack) != 0 {
|
||||||
|
isLastStack := len(t.Causes) == 0
|
||||||
|
stackMarker := "├── "
|
||||||
|
if isLastStack {
|
||||||
|
stackMarker = "└── "
|
||||||
|
}
|
||||||
|
frames := t.Stack.Frames()
|
||||||
|
fmt.Fprintf(w, "%s%s[stack: %d frames]\n", childPrefix, stackMarker, len(frames))
|
||||||
|
for i := 0; i < len(frames) && i < 3; i++ {
|
||||||
|
frame := frames[i]
|
||||||
|
fmt.Fprintf(w, "%s %s:%d %s\n", childPrefix, shortenPath(frame.File), frame.LineNumber, frame.FuncName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recurse Causes (show full child)
|
||||||
|
for i, cause := range t.Causes {
|
||||||
|
isLastCause := i == len(t.Causes)-1
|
||||||
|
cause.print(w, childPrefix, isLastCause)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// shortenPath acorta rutas largas para mejor legibilidad
|
||||||
|
func shortenPath(path string) string {
|
||||||
|
parts := strings.Split(path, "/")
|
||||||
|
if len(parts) > 3 {
|
||||||
|
return ".../" + strings.Join(parts[len(parts)-2:], "/")
|
||||||
|
}
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tree) Print(w io.Writer) {
|
||||||
|
if t == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.print(w, "", true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// String implementa fmt.Stringer para print directo
|
||||||
|
func (t *Tree) String() string {
|
||||||
|
var buf strings.Builder
|
||||||
|
t.Print(&buf)
|
||||||
|
return buf.String()
|
||||||
|
}
|
||||||
@ -0,0 +1,90 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_cause.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 08/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 severity, 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 (
|
||||||
|
MetaCauseName = "cause"
|
||||||
|
)
|
||||||
|
|
||||||
|
type withCause struct {
|
||||||
|
error
|
||||||
|
cause error
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddCause(cause error) Adder {
|
||||||
|
return AddFnc(func(err error) error { return WithCause(err, cause) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithCause(err error, cause error) error {
|
||||||
|
if err == nil {
|
||||||
|
if cause != nil {
|
||||||
|
return cause
|
||||||
|
}
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
if cause == nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return withCause{
|
||||||
|
error: err,
|
||||||
|
cause: cause,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,163 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_causes.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 15/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 severity, 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 MetaCausesName = "causes"
|
||||||
|
|
||||||
|
// withCauses is an internal wrapper that associates one or more *causal errors*
|
||||||
|
// to an error without changing its semantic identity.
|
||||||
|
//
|
||||||
|
// IMPORTANT DESIGN NOTES:
|
||||||
|
//
|
||||||
|
// - Causes are NOT part of the Go unwrap chain.
|
||||||
|
// - Causes do NOT represent "previous" errors in the sense of errors.Is / errors.As.
|
||||||
|
// - Causes are purely explanatory: they answer *why* an error occurred,
|
||||||
|
// not *what* error it is.
|
||||||
|
//
|
||||||
|
// Each withCauses instance owns ONLY the causes it introduces.
|
||||||
|
// Causes are NOT inherited, merged, or propagated from wrapped errors.
|
||||||
|
// This avoids duplication and ensures that causes appear exactly once
|
||||||
|
// when traversing the error chain.
|
||||||
|
//
|
||||||
|
// The wrapped `error` represents the semantic identity of the error
|
||||||
|
// and is the only value returned by Unwrap().
|
||||||
|
type withCauses struct {
|
||||||
|
error
|
||||||
|
causes ErrorList // Uses ErrorList to normalize, clean and manage cause lists
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddCauses returns an Adder that attaches one or more causal errors to an error.
|
||||||
|
//
|
||||||
|
// This function is syntactic sugar around WithCauses, intended to be used
|
||||||
|
// in error composition pipelines.
|
||||||
|
//
|
||||||
|
// Causes added through this function are local to the wrapper created by
|
||||||
|
// WithCauses and are not propagated to inner errors.
|
||||||
|
func AddCauses(causes ...error) Adder {
|
||||||
|
return AddFnc(func(err error) error {
|
||||||
|
return WithCauses(err, causes...)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithCauses associates one or more causal errors to err.
|
||||||
|
//
|
||||||
|
// Conceptual model:
|
||||||
|
//
|
||||||
|
// - `err` represents the *identity* of the error (what failed).
|
||||||
|
// - `causes` represent the *explanation* (why it failed).
|
||||||
|
//
|
||||||
|
// Causes are NOT merged with existing causes in wrapped errors.
|
||||||
|
// Each call to WithCauses introduces a new causal layer that owns
|
||||||
|
// its causes exclusively.
|
||||||
|
//
|
||||||
|
// This design guarantees that:
|
||||||
|
// - causes are not duplicated when unwrapping errors
|
||||||
|
// - the causal graph remains stable and predictable
|
||||||
|
// - error identity and causality are clearly separated
|
||||||
|
//
|
||||||
|
// Behaviour:
|
||||||
|
// - If err is nil and causes are provided, a MultiError is created.
|
||||||
|
// - If err is nil and no causes are provided, the function panics.
|
||||||
|
// - If no valid causes remain after cleaning, err is returned unchanged.
|
||||||
|
// Example:
|
||||||
|
// err := errs.WithCauses(baseErr, io.EOF, os.ErrNotExist)
|
||||||
|
// // err identity = baseErr
|
||||||
|
// // err causes = [io.EOF, os.ErrNotExist]
|
||||||
|
// // errors.Is(err, baseErr) == true
|
||||||
|
// // errors.Is(err, io.EOF) == false (causes not in Is chain)
|
||||||
|
|
||||||
|
func WithCauses(err error, causes ...error) error {
|
||||||
|
lc := ErrorList(causes).Clean()
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
if len(lc) > 0 {
|
||||||
|
return MakeMultiError(lc)
|
||||||
|
}
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
|
||||||
|
// No causes → no wrapper
|
||||||
|
if len(lc) == 0 {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return withCauses{
|
||||||
|
error: err,
|
||||||
|
causes: lc,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Causes returns the causal errors introduced by this wrapper.
|
||||||
|
//
|
||||||
|
// The returned causes are local to this withCauses instance and do not
|
||||||
|
// include causes from wrapped errors.
|
||||||
|
func (w withCauses) Causes() []error {
|
||||||
|
return w.causes
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unwrap returns the semantic identity of the error.
|
||||||
|
//
|
||||||
|
// Causes are intentionally NOT part of the unwrap chain.
|
||||||
|
// This preserves compatibility with Go's errors.Is / errors.As mechanisms
|
||||||
|
// and keeps causality orthogonal to error identity.
|
||||||
|
func (w withCauses) Unwrap() error {
|
||||||
|
return w.error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect exports the causes to the provided Collector if the collector
|
||||||
|
// is configured to accept causes.
|
||||||
|
//
|
||||||
|
// 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...)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,91 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_date.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const MetaDateName = "date"
|
||||||
|
|
||||||
|
type withDate struct {
|
||||||
|
error
|
||||||
|
date time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddDate() Adder {
|
||||||
|
return AddFnc(WithDate)
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithDate(err error) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
return withDate{
|
||||||
|
error: err,
|
||||||
|
date: time.Now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withDate) Unwrap() error {
|
||||||
|
return w.error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withDate) Date() time.Time { return w.date }
|
||||||
|
|
||||||
|
// Meta interface implementación
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,113 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_info.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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 (
|
||||||
|
MetaInfoDescName = "desc"
|
||||||
|
MetaInfoHelpName = "help"
|
||||||
|
MetaInfoLinkName = "link"
|
||||||
|
)
|
||||||
|
|
||||||
|
type withInfo struct {
|
||||||
|
error // The wrapped error
|
||||||
|
desc string // A descriptive message about the error
|
||||||
|
help string // Text providing guidance on how to resolve the error
|
||||||
|
link string // A URL pointing to documentation related to the error
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddInfo(desc, help, link string) Adder {
|
||||||
|
return AddFnc(func(e error) error { return WithInfo(e, desc, help, link) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithInfo(err error, desc, help, link string) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
return withInfo{
|
||||||
|
error: err,
|
||||||
|
desc: desc,
|
||||||
|
help: help,
|
||||||
|
link: link,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Desc returns the descriptive message about the error.
|
||||||
|
func (w withInfo) Desc() string { return w.desc }
|
||||||
|
|
||||||
|
// Help returns the help text for resolving the error.
|
||||||
|
func (w withInfo) Help() string { return w.help }
|
||||||
|
|
||||||
|
// Link returns the documentation link for the error.
|
||||||
|
func (w withInfo) Link() string { return w.link }
|
||||||
|
|
||||||
|
// Unwrap implements Go 1.13+'s errors.Unwrap interface.
|
||||||
|
// It returns the wrapped error.
|
||||||
|
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),
|
||||||
|
MakeMeta(MetaInfoHelpName, w.help),
|
||||||
|
MakeMeta(MetaInfoLinkName, w.link))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(w.desc) > 0 {
|
||||||
|
collector.AddMetas(MakeMeta(MetaInfoDescName, w.desc))
|
||||||
|
}
|
||||||
|
if len(w.help) > 0 {
|
||||||
|
collector.AddMetas(MakeMeta(MetaInfoHelpName, w.help))
|
||||||
|
}
|
||||||
|
if len(w.link) > 0 {
|
||||||
|
collector.AddMetas(MakeMeta(MetaInfoLinkName, w.link))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,93 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_message.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
const MetaMessageName = "message"
|
||||||
|
|
||||||
|
type withMessage struct {
|
||||||
|
error
|
||||||
|
message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddMessage(message string, args ...any) Adder {
|
||||||
|
return AddFnc(func(err error) error { return WithMessage(err, message, args...) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithMessage(err error, message string, args ...any) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
m := message
|
||||||
|
if len(args) > 0 {
|
||||||
|
m = fmt.Sprintf(message, args...)
|
||||||
|
}
|
||||||
|
return withMessage{
|
||||||
|
error: err,
|
||||||
|
message: m,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withMessage) Unwrap() error {
|
||||||
|
return w.error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withMessage) Message() string { return w.message }
|
||||||
|
|
||||||
|
// Meta interface implementación
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,84 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_metas.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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
|
||||||
|
|
||||||
|
type withMetas struct {
|
||||||
|
error
|
||||||
|
metas []Meta
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddMetas(metas ...Meta) Adder {
|
||||||
|
return AddFnc(func(err error) error { return WithMetas(err, metas...) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithMetas(err error, metas ...Meta) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
if len(metas) == 0 {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return withMetas{
|
||||||
|
error: err,
|
||||||
|
metas: metas,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withMetas) Metas() []Meta { return w.metas }
|
||||||
|
|
||||||
|
func (w withMetas) Unwrap() error {
|
||||||
|
return w.error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withMetas) Collect(collector Collector) {
|
||||||
|
if collector.Options().HasMetas() {
|
||||||
|
collector.AddMetas(w.metas...)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,107 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_observed.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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 (
|
||||||
|
MetaObservedObserverName = "observed_by"
|
||||||
|
MetaObservedInstanceName = "observed_instance"
|
||||||
|
)
|
||||||
|
|
||||||
|
type withObserved struct {
|
||||||
|
error
|
||||||
|
observer string
|
||||||
|
instance string
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddObserved(observer string, instance ...string) Adder {
|
||||||
|
return AddFnc(func(err error) error { return WithObserved(err, observer, instance...) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithObserved(err error, observer string, instance ...string) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
var inst string
|
||||||
|
if len(instance) > 0 {
|
||||||
|
inst = instance[0]
|
||||||
|
}
|
||||||
|
return withObserved{
|
||||||
|
error: err,
|
||||||
|
observer: observer,
|
||||||
|
instance: inst,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Observer returns the name of the component or service that observed the error.
|
||||||
|
func (w withObserved) Observer() string { return w.observer }
|
||||||
|
|
||||||
|
// Instance returns the optional instance identifier of the observer.
|
||||||
|
func (w withObserved) Instance() string { return w.instance }
|
||||||
|
|
||||||
|
// Unwrap implements Go 1.13+'s errors.Unwrap interface.
|
||||||
|
// It returns the wrapped error.
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,119 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_origin.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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 (
|
||||||
|
MetaOriginClusterName = "origin_cluster"
|
||||||
|
MetaOriginServerName = "origin_server"
|
||||||
|
MetaOriginServiceName = "origin_service"
|
||||||
|
MetaOriginInstanceName = "origin_instance"
|
||||||
|
)
|
||||||
|
|
||||||
|
type withOrigin struct {
|
||||||
|
error
|
||||||
|
cluster,
|
||||||
|
server,
|
||||||
|
service,
|
||||||
|
instance string
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddOrigin(cluster, server, service, instance string) Adder {
|
||||||
|
return AddFnc(func(e error) error { return WithOrigin(e, cluster, server, service, instance) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithOrigin(err error, cluster, server, service, instance string) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
return withOrigin{
|
||||||
|
error: err,
|
||||||
|
cluster: cluster,
|
||||||
|
server: server,
|
||||||
|
service: service,
|
||||||
|
instance: instance,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withOrigin) Cluster() string { return w.cluster }
|
||||||
|
|
||||||
|
// Service returns the name of the service where the error originated.
|
||||||
|
func (w withOrigin) Service() string { return w.service }
|
||||||
|
|
||||||
|
// Instance returns the optional instance identifier of the originating service.
|
||||||
|
func (w withOrigin) Instance() string { return w.instance }
|
||||||
|
|
||||||
|
// Unwrap implements Go 1.13+'s errors.Unwrap interface.
|
||||||
|
// It returns the wrapped error.
|
||||||
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,138 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_retryability.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
MetaRetryEnabledName = "retry_enabled"
|
||||||
|
MetaRetryTemporaryName = "retry_temporary"
|
||||||
|
MetaRetryIdempotentName = "retry_idempotent"
|
||||||
|
MetaRetryAfterName = "retry_after"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// RetryEnabled is a flag indicating the error is potentially retryable.
|
||||||
|
RetryEnabled uint8 = 1 << iota
|
||||||
|
// RetryIsTemporary is a flag indicating the error is temporary and might resolve on retry.
|
||||||
|
RetryIsTemporary
|
||||||
|
// RetryRetryAfterIsSet is a flag indicating that the 'After' duration is set and should be used for retry delay.
|
||||||
|
RetryRetryAfterIsSet
|
||||||
|
// RetryIsIdempotent is a flag indicating that retrying the operation is idempotent (safe to repeat).
|
||||||
|
RetryIsIdempotent
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
// withRetry is a type that wraps an error and adds information about its retryability.
|
||||||
|
// This is useful for implementing retry logic in clients or middleware.
|
||||||
|
withRetry struct {
|
||||||
|
error // The wrapped error
|
||||||
|
flags uint8 // A bitmask of Retry flags
|
||||||
|
after time.Duration // The suggested duration to wait before retrying (only valid if RetryRetryAfterIsSet is set in flags)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// AddRetry creates a Adder that adds retryable information to an error.
|
||||||
|
// Takes a bitmask of flags and an optional retry-after duration.
|
||||||
|
func AddRetry(ops uint8, after time.Duration) Adder {
|
||||||
|
return AddFnc(func(e error) error {
|
||||||
|
return WithRetry(e, ops, after)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithRetry creates a new withRetry by wrapping an existing error
|
||||||
|
// and associating it with retryable flags and an optional retry-after duration.
|
||||||
|
// Panics if the provided error is nil.
|
||||||
|
func WithRetry(err error, ops uint8, retryAfter time.Duration) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
return withRetry{
|
||||||
|
error: err,
|
||||||
|
flags: ops,
|
||||||
|
after: retryAfter,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CanRetry returns true if the RetryEnabled flag is set.
|
||||||
|
func (w withRetry) CanRetry() bool { return w.flags&RetryEnabled != 0 }
|
||||||
|
|
||||||
|
// IsTemporary returns true if the RetryIsTemporary flag is set.
|
||||||
|
func (w withRetry) IsTemporary() bool { return w.flags&RetryIsTemporary != 0 }
|
||||||
|
|
||||||
|
// IsIdempotent returns true if the RetryIsIdempotent flag is set.
|
||||||
|
func (w withRetry) IsIdempotent() bool { return w.flags&RetryIsIdempotent != 0 }
|
||||||
|
|
||||||
|
// After returns the retry-after duration and a boolean indicating if it was explicitly set.
|
||||||
|
func (w withRetry) After() time.Duration {
|
||||||
|
if w.flags&RetryRetryAfterIsSet != 0 {
|
||||||
|
return w.after
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unwrap implements Go 1.13+'s errors.Unwrap interface.
|
||||||
|
// It returns the wrapped error.
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,88 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_severity.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
const MetaSeverityName = "severity"
|
||||||
|
|
||||||
|
type withSeverity struct {
|
||||||
|
error
|
||||||
|
severity Severity
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddSeverity(severity Severity) Adder {
|
||||||
|
return AddFnc(func(err error) error { return WithSeverity(err, severity) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithSeverity(err error, severity Severity) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
return withSeverity{
|
||||||
|
error: err,
|
||||||
|
severity: severity,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withSeverity) Severity() Severity { return w.severity }
|
||||||
|
|
||||||
|
// Meta interface implementación
|
||||||
|
func (w withSeverity) Name() string { return MetaSeverityName }
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,96 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_stack.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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 MetaStackName = "stack"
|
||||||
|
|
||||||
|
type withStack struct {
|
||||||
|
error
|
||||||
|
stack Stack
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddStack(values ...int) Adder {
|
||||||
|
return AddFnc(func(err error) error { return WithStack(err, values...) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithStack(err error, values ...int) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
// Determine offset and max frames from optional values.
|
||||||
|
ox, mx := 0, -1
|
||||||
|
if len(values) > 0 {
|
||||||
|
ox = values[0]
|
||||||
|
if len(values) > 1 {
|
||||||
|
mx = values[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return withStack{
|
||||||
|
error: err,
|
||||||
|
stack: CreateStack(ox, mx), // Capture the stack trace.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withStack) Stack() Stack { return w.stack }
|
||||||
|
|
||||||
|
func (w withStack) Unwrap() error {
|
||||||
|
return w.error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Meta interface implementación
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,84 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_status.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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 MetaStatusName = "status" // Cambiado para no colisionar con "severity"
|
||||||
|
|
||||||
|
type withStatus struct {
|
||||||
|
error
|
||||||
|
status int
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddStatus(status int) Adder {
|
||||||
|
return AddFnc(func(err error) error { return WithStatus(err, status) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithStatus(err error, status int) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
return withStatus{
|
||||||
|
error: err,
|
||||||
|
status: status,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status devuelve el código de estado numérico asociado.
|
||||||
|
func (w withStatus) Status() int { return w.status }
|
||||||
|
|
||||||
|
// Meta interface implementación
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,88 @@
|
|||||||
|
/* ——————————————————————————————————————————————————————————————————————————
|
||||||
|
Proyecto FWS
|
||||||
|
—————————————————————————————————————————————————————————————————————————————
|
||||||
|
Fichero with_user.go
|
||||||
|
Package errs
|
||||||
|
Autor Juan V. Navarro juanvnl@activething.com
|
||||||
|
Creado 16/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 severity, 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 MetaUserName = "user"
|
||||||
|
|
||||||
|
type withUser struct {
|
||||||
|
error
|
||||||
|
user string
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddUser(user string) Adder {
|
||||||
|
return AddFnc(func(err error) error { return WithUser(err, user) })
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithUser(err error, user string) error {
|
||||||
|
if err == nil {
|
||||||
|
panic(MakePanicError(ErrNilError))
|
||||||
|
}
|
||||||
|
return withUser{
|
||||||
|
|
||||||
|
error: err,
|
||||||
|
user: user,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withUser) Unwrap() error {
|
||||||
|
return w.error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (w withUser) User() string { return w.user }
|
||||||
|
|
||||||
|
// Meta interface implementación
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
module src
|
||||||
|
|
||||||
|
go 1.25
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
go 1.25
|
||||||
|
|
||||||
|
|
||||||
|
use (
|
||||||
|
|
||||||
|
./core/errs
|
||||||
|
./apps/apperrs
|
||||||
|
|
||||||
|
)
|
||||||
Loading…
Reference in new issue