Files
presenter/error.go
T

99 lines
2.5 KiB
Go
Raw Permalink Normal View History

2025-03-30 13:27:34 +02:00
package presenter
import "errors"
type (
Code string
Entity string
)
const (
CodeConflict = Code("CONFLICT")
CodeNotFound = Code("NOT_FOUND")
CodePreconditionFailed = Code("PRECONDITION_FAILED")
)
const (
EntityCompany = Entity("COMPANY")
EntityConsumer = Entity("CONSUMER")
EntityAddress = Entity("ADDRESS")
EntityContactPerson = Entity("CONTACT_PERSON")
EntityActivity = Entity("ACTIVITY")
EntityPrice = Entity("PRICE")
EntityEmployee = Entity("EMPLOYEE")
EntityContract = Entity("CONTRACT")
EntityEmploymentAgreement = Entity("EMPLOYMENT_AGREEMENT")
EntityInvoiceBasis = Entity("INVOICE_BASIS")
EntityInvoice = Entity("INVOICE")
EntitySupplier = Entity("SUPPLIER")
EntitySupplierInvoice = Entity("SUPPLIER_INVOICE")
EntityTimeEntry = Entity("TIME_ENTRY")
EntityEntrySeries = Entity("ENTRY_SERIES")
EntityFiscalYear = Entity("FISCAL_YEAR")
EntityAccountClass = Entity("ACCOUNT_CLASS")
EntityAccountGroup = Entity("ACCOUNT_GROUP")
EntityAccount = Entity("ACCOUNT")
EntityTag = Entity("TAG")
EntityEntry = Entity("ENTRY")
EntityEntryBasis = Entity("ENTRY_BASIS")
EntityBankConnection = Entity("BANK_CONNECTION")
EntityBankTransaction = Entity("BANK_TRANSACTION")
2025-03-30 13:27:34 +02:00
)
type CodedError struct {
Message string
Code Code
Entity Entity
Params map[string]string
}
func NewCodedError(message string, code Code, entity Entity) CodedError {
return CodedError{
Message: message,
Code: code,
Entity: entity,
Params: make(map[string]string),
}
}
func (c CodedError) Error() string {
return c.Message
}
func (c CodedError) Is(err error) bool {
var e CodedError
if errors.As(err, &e) {
return c.Code == e.Code && c.Entity == e.Entity && c.Message == e.Message && mapEqual(c.Params, e.Params)
}
return false
}
func mapEqual(m1, m2 map[string]string) bool {
if len(m1) != len(m2) {
return false
}
for k1, v1 := range m1 {
v2, exists := m2[k1]
if !exists || v1 != v2 {
return false
}
}
return true
}
func (c CodedError) WithParam(key, value string) CodedError {
params := make(map[string]string)
for k, v := range c.Params {
params[k] = v
}
params[key] = value
return CodedError{
Message: c.Message,
Code: c.Code,
Entity: c.Entity,
Params: params,
}
}
var _ error = CodedError{}