parent
fa906bf014
commit
739cd70fde
@ -0,0 +1,3 @@
|
|||||||
|
module app
|
||||||
|
|
||||||
|
go 1.22
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errs"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func callerA () {
|
||||||
|
callerB()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func callerB () {
|
||||||
|
e := errs.NewErrInfo(errs.ErrCode("Un-Error"),
|
||||||
|
errs.ErrInfoWithDate(),
|
||||||
|
errs.ErrInfoWithCause(errs.ErrCode("UnMalError")),
|
||||||
|
errs.ErrInfoWithField("Campo1",33),
|
||||||
|
errs.ErrInfoWithMessage("Esto es el mensage"),
|
||||||
|
errs.ErrInfoWithStack(0),
|
||||||
|
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
fmt.Print(e.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
|
||||||
|
callerA()
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name active.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package errs
|
||||||
|
|
||||||
|
|
||||||
|
const (
|
||||||
|
stackMaxFrames = 32
|
||||||
|
stackSkipFrames = 2
|
||||||
|
|
||||||
|
unknownInfo = "???"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
traceUnknown string = "??"
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
G = struct {
|
||||||
|
ErrPanic ErrCode
|
||||||
|
ErrParamNil ErrCode
|
||||||
|
ErrParamInvalid ErrCode
|
||||||
|
ErrParamOutOfRange ErrCode
|
||||||
|
}{
|
||||||
|
ErrPanic: ErrCode("core:errs.panic-error"),
|
||||||
|
ErrParamNil: ErrCode("core:errs.param-nil"),
|
||||||
|
ErrParamInvalid: ErrCode("core:errs.param-invalid"),
|
||||||
|
ErrParamOutOfRange: ErrCode("core:errs.param-out-of-range"),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name causer.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package errs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Causer interface {
|
||||||
|
|
||||||
|
Cause () error
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CauseFnc func () error
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (f CauseFnc) Cause() error {
|
||||||
|
return f() }
|
||||||
|
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name err_cause.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package errs
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
ErrCause struct {
|
||||||
|
error
|
||||||
|
cause error
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewErrCause (err, cause error) *ErrCause {
|
||||||
|
if err == nil {
|
||||||
|
if cause == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &ErrCause{ error: cause }
|
||||||
|
}
|
||||||
|
return &ErrCause {
|
||||||
|
error: err,
|
||||||
|
cause: cause,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (e ErrCause) Cause () error {
|
||||||
|
return e.cause }
|
||||||
|
|
||||||
|
func (e ErrCause) Unwrap() error {
|
||||||
|
return e.cause }
|
||||||
|
|
||||||
|
func (e ErrCause) String() string {
|
||||||
|
return fmt.Sprintf("%s <- %s",e.Error(),e.cause.Error()) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (e ErrCause) ToErrInfo (options ...ErrInfoFnc) *ErrInfo {
|
||||||
|
return NewErrInfo(e,options...) }
|
||||||
@ -0,0 +1,78 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name err_code.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package errs
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// ErrCode
|
||||||
|
// Representa una cadena identificando un error.
|
||||||
|
// Dicha cadena debe de estar formada por el dominio del paquete y un codigo alfa identificando el error, con la
|
||||||
|
// siguiente estructura
|
||||||
|
// dominio:paquete.codigo-del-error
|
||||||
|
//
|
||||||
|
// como por ejemplo:
|
||||||
|
// activething.com:http.404-not-found
|
||||||
|
// activething.com:byte.buffer-overflow
|
||||||
|
//
|
||||||
|
// Implementa: Error
|
||||||
|
ErrCode string
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (e ErrCode) Error() string {
|
||||||
|
return string(e) }
|
||||||
|
|
||||||
|
func (e ErrCode) Cause() error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (e ErrCode) Unwrap() error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (e ErrCode) Stack() *Stack {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (e ErrCode) ToErrCause(cause error) *ErrCause {
|
||||||
|
return NewErrCause(e, cause) }
|
||||||
|
|
||||||
|
func (e ErrCode) ToErrInfo (options ...ErrInfoFnc) *ErrInfo {
|
||||||
|
return NewErrInfo(e,options...) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,130 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name err_info.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package errs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
// ErrInfo
|
||||||
|
// Representa un objeto para añadir una capa de información addicional a un error
|
||||||
|
//
|
||||||
|
ErrInfo struct {
|
||||||
|
/*embedded*/ error
|
||||||
|
date time.Time
|
||||||
|
help string
|
||||||
|
message string
|
||||||
|
fields map[string]any
|
||||||
|
stack Stack
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ErrInfoFnc func (info *ErrInfo)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func NewErrInfo (err error, options ...ErrInfoFnc) *ErrInfo {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return applyErrInfoOptions(&ErrInfo{ error: err }, options ...)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (e ErrInfo) Cause() error {
|
||||||
|
if cs,is := e.error.(Causer); is {
|
||||||
|
return cs.Cause()
|
||||||
|
}
|
||||||
|
return Unwrap(e.error)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (e ErrInfo) Date () time.Time {
|
||||||
|
return e.date }
|
||||||
|
|
||||||
|
func (e ErrInfo) Message() string {
|
||||||
|
return e.message }
|
||||||
|
|
||||||
|
func (e ErrInfo) Help () string {
|
||||||
|
return e.help }
|
||||||
|
|
||||||
|
func (e ErrInfo) Stack () Stack {
|
||||||
|
return e.stack }
|
||||||
|
|
||||||
|
|
||||||
|
func (e ErrInfo) Fields () map[string]any {
|
||||||
|
return e.fields }
|
||||||
|
|
||||||
|
|
||||||
|
func (e ErrInfo) String () string {
|
||||||
|
bf := bytes.Buffer{}
|
||||||
|
defer bf.Reset()
|
||||||
|
|
||||||
|
bf.WriteString("Error **************************************************\n")
|
||||||
|
bf.WriteString("Source : ")
|
||||||
|
bf.WriteString(e.error.Error())
|
||||||
|
|
||||||
|
if e.Cause() != nil {
|
||||||
|
bf.WriteString("\nCause : ")
|
||||||
|
bf.WriteString(e.Cause().Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(e.message) > 0 {
|
||||||
|
bf.WriteString("\nMessage: ")
|
||||||
|
bf.WriteString(e.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !e.date.IsZero() {
|
||||||
|
bf.WriteString("\nDate : ")
|
||||||
|
bf.WriteString(e.date.Format(time.RFC850))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(e.help) > 0 {
|
||||||
|
bf.WriteString("\nHelp : ")
|
||||||
|
bf.WriteString(e.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(e.fields) > 0 {
|
||||||
|
bf.WriteString(fmt.Sprintf("\nFields : (%d)",len(e.fields)))
|
||||||
|
for f, v := range e.fields {
|
||||||
|
bf.WriteString(fmt.Sprintf("\n - %s: %v",f,v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if e.stack != nil {
|
||||||
|
bf.WriteString("\nStack --------------------------------------------------\n")
|
||||||
|
bf.WriteString(e.stack.String())
|
||||||
|
bf.WriteString("\n--------------------------------------------------------\n")
|
||||||
|
}
|
||||||
|
return bf.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,79 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name err_info_ops.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package errs
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
func ErrInfoWithCause (cause error) ErrInfoFnc {
|
||||||
|
return func(e *ErrInfo) {
|
||||||
|
if cause == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
e.error = *NewErrCause(e.error,cause)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ErrInfoWithDate () ErrInfoFnc {
|
||||||
|
return func(e *ErrInfo) {
|
||||||
|
e.date = time.Now() }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func ErrInfoWithStack (offset int) ErrInfoFnc {
|
||||||
|
return func (e *ErrInfo) {
|
||||||
|
e.stack = MakeStack(offset) }
|
||||||
|
}
|
||||||
|
|
||||||
|
func ErrInfoWithMessage(message string) ErrInfoFnc {
|
||||||
|
return func (e *ErrInfo) {
|
||||||
|
e.message = message }
|
||||||
|
}
|
||||||
|
|
||||||
|
func ErrInfoWithHelp (help string) ErrInfoFnc {
|
||||||
|
return func (e *ErrInfo) {
|
||||||
|
e.help = help }
|
||||||
|
}
|
||||||
|
|
||||||
|
func ErrInfoWithField(name string, value any) ErrInfoFnc {
|
||||||
|
return func (e *ErrInfo) {
|
||||||
|
if e.fields == nil {
|
||||||
|
e.fields = map[string]any{name: value}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
e.fields[name] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func applyErrInfoOptions (errInfo *ErrInfo, options ...ErrInfoFnc) *ErrInfo {
|
||||||
|
for _,o := range options {
|
||||||
|
o(errInfo)
|
||||||
|
}
|
||||||
|
return errInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name stack_trace.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package errs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
Stack []uintptr
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func MakeStack(offset int) Stack {
|
||||||
|
ls := make([]uintptr,stackMaxFrames)
|
||||||
|
if offset < 0 {
|
||||||
|
offset = 0
|
||||||
|
}
|
||||||
|
cn := runtime.Callers(offset+stackSkipFrames,ls)
|
||||||
|
return ls[:cn]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (s Stack) Frames() []StackFrame {
|
||||||
|
f := make([]StackFrame,len(s))
|
||||||
|
for i,p := range s {
|
||||||
|
f[i]=*NewStackFrame(p)
|
||||||
|
}
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (s Stack) String () (res string) {
|
||||||
|
bf := bytes.Buffer{}
|
||||||
|
defer bf.Reset()
|
||||||
|
for _,f := range s.Frames() {
|
||||||
|
bf.WriteString(f.String())
|
||||||
|
}
|
||||||
|
res = bf.String()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
I HAVE NO DESIRE TO WALK ON WATER," SAID SIDDHARTA.
|
||||||
|
"LET THE OLD SHRAMANAS SATISFY THEMSELVES WITH SUCH SKILLS.
|
||||||
|
|
||||||
|
SIDDHARTA
|
||||||
|
- HERMANN HESSE -
|
||||||
|
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
*/
|
||||||
@ -0,0 +1,111 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name stack_frame.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 20/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package errs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
StackFrame struct {
|
||||||
|
LineNumber int // Number line
|
||||||
|
File string // File FuncName
|
||||||
|
FuncName string // Function name
|
||||||
|
Package string // Package name
|
||||||
|
Counter uintptr
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func NewStackFrame (counter uintptr) *StackFrame {
|
||||||
|
if counter == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
sf := &StackFrame{
|
||||||
|
Counter: counter,
|
||||||
|
}
|
||||||
|
fn := runtime.FuncForPC(counter)
|
||||||
|
sf.Package, sf.FuncName = packageAndName(fn)
|
||||||
|
sf.File, sf.LineNumber = fn.FileLine(counter-1)
|
||||||
|
return sf
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func (f StackFrame) SourceLine() (string, error) {
|
||||||
|
if f.LineNumber <= 0 {
|
||||||
|
return unknownInfo, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := os.Open(f.File)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
currentLine := 1
|
||||||
|
for scanner.Scan() {
|
||||||
|
if currentLine == f.LineNumber {
|
||||||
|
return string(bytes.Trim(scanner.Bytes(), " \t")), nil
|
||||||
|
}
|
||||||
|
currentLine++
|
||||||
|
}
|
||||||
|
_ = file.Close()
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return unknownInfo, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (f StackFrame) String () string {
|
||||||
|
source, err := f.SourceLine()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Sprintf("%s:%d (0x%x)\n\t%s:%s\n", f.File, f.LineNumber, f.Counter, f.Package, f.FuncName)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%s:%d (0x%x)\n\t%s:%s -> %s\n", f.File, f.LineNumber, f.Counter, f.Package, f.FuncName, source)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func packageAndName (fn *runtime.Func) (string,string) {
|
||||||
|
nm := fn.Name()
|
||||||
|
pg := ""
|
||||||
|
if ls := strings.LastIndex(nm,"/"); ls >= 0 {
|
||||||
|
pg = nm[:ls] + "/"
|
||||||
|
nm = nm[ls+1:]
|
||||||
|
}
|
||||||
|
if pd := strings.Index(nm,"."); pd >= 0 {
|
||||||
|
pg += nm[:pd]
|
||||||
|
nm = nm[pd+1:]
|
||||||
|
}
|
||||||
|
return pg,strings.Replace(nm,"·", ".",-1)
|
||||||
|
}
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active2
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name unwraper.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 21/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package errs
|
||||||
|
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Unwrapper interface {
|
||||||
|
Unwrap () error
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UnwrapperFnc func () error
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func (f UnwrapperFnc) Unwrap () error {
|
||||||
|
return f() }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func Unwrap (err error) error {
|
||||||
|
if cs,is := err.(Unwrapper); is {
|
||||||
|
return cs.Unwrap()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,84 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name bytes.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 07/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package rets
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
BytesResult interface {
|
||||||
|
Result
|
||||||
|
Value() []byte // GResult implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BytesSuccess []byte
|
||||||
|
|
||||||
|
|
||||||
|
BytesError struct{
|
||||||
|
error
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
func TupleBytesSuccess(bytes []byte) ([]byte, error) {
|
||||||
|
return bytes, nil }
|
||||||
|
|
||||||
|
func TupleBytesError(err error) ([]byte, error) {
|
||||||
|
return nil, err }
|
||||||
|
|
||||||
|
// BytesSuccess -> BytesResult Implementation
|
||||||
|
|
||||||
|
func MakeBytesSuccess(success []byte) BytesSuccess {
|
||||||
|
return success }
|
||||||
|
|
||||||
|
func (_ BytesSuccess) Ok() bool {
|
||||||
|
return true }
|
||||||
|
|
||||||
|
func (_ BytesSuccess) Fail() error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (s BytesSuccess) Value() []byte {
|
||||||
|
return s }
|
||||||
|
|
||||||
|
func (s BytesSuccess) Success() any {
|
||||||
|
return s }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// BytesError -> BytesResult Implementation
|
||||||
|
|
||||||
|
func MakeBytesError(cause error) BytesError {
|
||||||
|
return BytesError{cause} }
|
||||||
|
|
||||||
|
func (e BytesError) Ok() bool {
|
||||||
|
return false }
|
||||||
|
|
||||||
|
func (e BytesError) Fail() error {
|
||||||
|
return e.error }
|
||||||
|
|
||||||
|
func (_ BytesError) Value() []byte {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (_ BytesError) Success() any {
|
||||||
|
return nil }
|
||||||
@ -0,0 +1,86 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name result.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 07/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package rets
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
|
||||||
|
GResult [T any] interface {
|
||||||
|
Result
|
||||||
|
Value() T
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultGSuccess [T any] struct {
|
||||||
|
Result T
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultGError [T any] struct {
|
||||||
|
error
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func TupleGSuccess[T any](res T) (T, error) {
|
||||||
|
return res, nil }
|
||||||
|
|
||||||
|
func TupleGError[T any](err error) (T, error) {
|
||||||
|
var r T
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeGSuccess[T any](res T) ResultGSuccess[T] {
|
||||||
|
return ResultGSuccess[T]{res} }
|
||||||
|
|
||||||
|
func (r ResultGSuccess[T]) Value() T {
|
||||||
|
return r.Result }
|
||||||
|
|
||||||
|
func (r ResultGSuccess[T]) Success() any {
|
||||||
|
return r.Result }
|
||||||
|
|
||||||
|
func (_ ResultGSuccess[T]) Ok() bool {
|
||||||
|
return true }
|
||||||
|
|
||||||
|
func (_ ResultGSuccess[T]) Fail() error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func MakeGError[T any](err error) ResultGError[T] {
|
||||||
|
return ResultGError[T]{error: err} }
|
||||||
|
|
||||||
|
func (r ResultGError[T]) Value() T {
|
||||||
|
var zero T
|
||||||
|
return zero
|
||||||
|
}
|
||||||
|
|
||||||
|
func (_ ResultGError[T]) Ok() bool {
|
||||||
|
return false }
|
||||||
|
|
||||||
|
func (r ResultGError[T]) Success() any {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
|
||||||
|
func (r ResultGError[T]) Fail() error {
|
||||||
|
return r.error }
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
module rets
|
||||||
|
|
||||||
|
go 1.22
|
||||||
@ -0,0 +1,80 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name int.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 07/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package rets
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
IntResult interface {
|
||||||
|
Result
|
||||||
|
Value() int // GResult implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
IntSuccess int
|
||||||
|
|
||||||
|
IntError struct{ error }
|
||||||
|
)
|
||||||
|
|
||||||
|
func TupleIntSuccess(result int) (int, error) {
|
||||||
|
return result, nil }
|
||||||
|
|
||||||
|
func TupleIntError(err error) ([]byte, error) {
|
||||||
|
return nil, err }
|
||||||
|
|
||||||
|
|
||||||
|
// IntSuccess -> Result, G.Result Implementation
|
||||||
|
|
||||||
|
func MakeIntSuccess(success int) IntSuccess {
|
||||||
|
return IntSuccess(success) }
|
||||||
|
|
||||||
|
func (_ IntSuccess) Ok() bool {
|
||||||
|
return true }
|
||||||
|
|
||||||
|
func (_ IntSuccess) Fail() error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (s IntSuccess) Success() any {
|
||||||
|
return s }
|
||||||
|
|
||||||
|
func (s IntSuccess) Value() int {
|
||||||
|
return int(s) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// IntError -> Result, G.Result Implementation
|
||||||
|
|
||||||
|
func MakeIntError(cause error) IntError {
|
||||||
|
return IntError{cause} }
|
||||||
|
|
||||||
|
func (e IntError) Ok() bool {
|
||||||
|
return false }
|
||||||
|
|
||||||
|
func (e IntError) Fail() error {
|
||||||
|
return e.error }
|
||||||
|
|
||||||
|
func (_ IntError) Success() any {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (_ IntError) Value() int {
|
||||||
|
return 0 }
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name result.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 08/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package rets
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
Result interface {
|
||||||
|
// Ok ; con un valor de true indica que el resultado
|
||||||
|
// se ha producido sin errores
|
||||||
|
Ok () bool
|
||||||
|
|
||||||
|
// Success Value; contiene el valor del resultado en caso
|
||||||
|
// de que no se haya producido un error, en ese caso
|
||||||
|
// devolvera nil.
|
||||||
|
Success() any
|
||||||
|
|
||||||
|
// Fail Error; contiene el error del resultado
|
||||||
|
Fail() error
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
)
|
||||||
@ -0,0 +1,80 @@
|
|||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Project active
|
||||||
|
// Active Thing (activething.com) git.activething.com/go
|
||||||
|
//
|
||||||
|
// File name string.go
|
||||||
|
// Created by DEV
|
||||||
|
// Modified 07/03/2024
|
||||||
|
//
|
||||||
|
// Copyright 2024 activething.com
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
package rets
|
||||||
|
|
||||||
|
type (
|
||||||
|
|
||||||
|
StringResult interface {
|
||||||
|
Result
|
||||||
|
Value() string // GResult implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
StringSuccess string
|
||||||
|
|
||||||
|
StringError struct{ error }
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func TupleStringSuccess(result string) (string, error) {
|
||||||
|
return result, nil }
|
||||||
|
|
||||||
|
func TupleStringError(err error) (string, error) {
|
||||||
|
return "", err }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// StringSuccess -> Result, G.Result Implementation
|
||||||
|
|
||||||
|
func (_ StringSuccess) Ok() bool {
|
||||||
|
return true }
|
||||||
|
|
||||||
|
func (s StringSuccess) Success() any {
|
||||||
|
return s }
|
||||||
|
|
||||||
|
func (_ StringSuccess) Fail() error {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (s StringSuccess) Value() string {
|
||||||
|
return string(s) }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// StringError -> Result, G.Result Implementation
|
||||||
|
|
||||||
|
func MakeStringError(cause error) IntError {
|
||||||
|
return IntError{cause} }
|
||||||
|
|
||||||
|
func (e StringError) Ok() bool {
|
||||||
|
return false }
|
||||||
|
|
||||||
|
func (_ StringError) Success() any {
|
||||||
|
return nil }
|
||||||
|
|
||||||
|
func (e StringError) Fail() error {
|
||||||
|
return e.error }
|
||||||
|
|
||||||
|
func (_ StringError) Value() string {
|
||||||
|
return "" }
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in new issue