Dragonfly2
124 строки · 2.7 Кб
1/*
2* Copyright 2020 The Dragonfly Authors
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17package dferrors
18
19import (
20"errors"
21"fmt"
22
23"google.golang.org/grpc/status"
24
25commonv1 "d7y.io/api/v2/pkg/apis/common/v1"
26)
27
28// common and framework errors
29var (
30ErrInvalidArgument = errors.New("invalid argument")
31ErrInvalidHeader = errors.New("invalid Header")
32ErrDataNotFound = errors.New("data not found")
33ErrEmptyValue = errors.New("empty value")
34ErrConvertFailed = errors.New("convert failed")
35ErrEndOfStream = errors.New("end of stream")
36ErrNoCandidateNode = errors.New("no candidate server node")
37)
38
39func IsEndOfStream(err error) bool {
40return err == ErrEndOfStream
41}
42
43type DfError struct {
44Code commonv1.Code
45Message string
46}
47
48func (s *DfError) Error() string {
49return fmt.Sprintf("[%d]%s", s.Code, s.Message)
50}
51
52func New(code commonv1.Code, msg string) *DfError {
53return &DfError{
54Code: code,
55Message: msg,
56}
57}
58
59func Newf(code commonv1.Code, format string, a ...any) *DfError {
60return &DfError{
61Code: code,
62Message: fmt.Sprintf(format, a...),
63}
64}
65
66func CheckError(err error, code commonv1.Code) bool {
67if err == nil {
68return false
69}
70
71e, ok := err.(*DfError)
72
73return ok && e.Code == code
74}
75
76// ConvertGRPCErrorToDfError converts grpc error to DfError, if it exists.
77func ConvertGRPCErrorToDfError(err error) error {
78for _, d := range status.Convert(err).Details() {
79switch internal := d.(type) {
80case *commonv1.GrpcDfError:
81return &DfError{
82Code: internal.Code,
83Message: internal.Message,
84}
85}
86}
87
88return err
89}
90
91func IsGRPCDfError(err error) (*DfError, bool) {
92for _, d := range status.Convert(err).Details() {
93switch internal := d.(type) {
94case *commonv1.GrpcDfError:
95return &DfError{
96Code: internal.Code,
97Message: internal.Message,
98}, true
99}
100}
101
102var de *DfError
103ok := errors.As(err, &de)
104if ok {
105return de, true
106}
107
108return nil, false
109}
110
111// ConvertDfErrorToGRPCError converts DfError to grpc error, if it is.
112func ConvertDfErrorToGRPCError(err error) error {
113if v, ok := err.(*DfError); ok {
114s, e := status.Convert(err).WithDetails(
115&commonv1.GrpcDfError{
116Code: v.Code,
117Message: v.Message,
118})
119if e == nil {
120err = s.Err()
121}
122}
123return err
124}
125