package domain import ( "errors" "strings" ) var ( ErrNotFound = errors.New("registro não encontrado") ErrConflict = errors.New("registro já existe") ErrCredentialsRequired = errors.New("credencial da PontoMais não configurada ou não validada") ErrUserNotActive = errors.New("usuário não está ativo") ErrInvalidState = errors.New("operação não permitida no estado atual") ErrUnauthenticated = errors.New("sessão inválida ou expirada") ErrForbidden = errors.New("permissão insuficiente") ErrInvalidLogin = errors.New("usuário ou senha inválidos") ErrAccountLocked = errors.New("conta bloqueada temporariamente por tentativas de login") ErrLastOwner = errors.New("é preciso manter pelo menos um owner ativo") ErrNotConfigured = errors.New("integração não configurada") ) type ValidationError struct { Field string `json:"field"` Message string `json:"message"` } // ValidationErrors agrupa erros de validação de campos (HTTP 422). type ValidationErrors []ValidationError func (v ValidationErrors) Error() string { parts := make([]string, 0, len(v)) for _, e := range v { parts = append(parts, e.Field+": "+e.Message) } return strings.Join(parts, "; ") } func (v *ValidationErrors) Add(field, message string) { *v = append(*v, ValidationError{Field: field, Message: message}) } // OrNil devolve nil quando não há erros, para uso em `return errs.OrNil()`. func (v ValidationErrors) OrNil() error { if len(v) == 0 { return nil } return v } // stateError é um ErrInvalidState com mensagem específica para o usuário. type stateError struct{ msg string } func (e stateError) Error() string { return e.msg } func (e stateError) Is(target error) bool { return target == ErrInvalidState } // InvalidState cria um erro que satisfaz errors.Is(err, ErrInvalidState). func InvalidState(msg string) error { return stateError{msg: msg} }