/*
 *
 * Copyright 2017 gRPC authors.
 *
 * 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 status implements errors returned by gRPC. These errors are // serialized and transmitted on the wire between server and client, and allow // for additional data to be transmitted via the Details field in the status // proto. gRPC service handlers should return an error created by this // package, and gRPC clients should expect a corresponding error to be // returned from the RPC call. // // This package upholds the invariants that a non-nil error may not // contain an OK code, and an OK code must result in a nil error.
package status import ( spb ) // Status references google.golang.org/grpc/internal/status. It represents an // RPC status code, message, and details. It is immutable and should be // created with New, Newf, or FromProto. // https://godoc.org/google.golang.org/grpc/internal/status type Status = status.Status // New returns a Status representing c and msg. func ( codes.Code, string) *Status { return status.New(, ) } // Newf returns New(c, fmt.Sprintf(format, a...)). func ( codes.Code, string, ...interface{}) *Status { return New(, fmt.Sprintf(, ...)) } // Error returns an error representing c and msg. If c is OK, returns nil. func ( codes.Code, string) error { return New(, ).Err() } // Errorf returns Error(c, fmt.Sprintf(format, a...)). func ( codes.Code, string, ...interface{}) error { return Error(, fmt.Sprintf(, ...)) } // ErrorProto returns an error representing s. If s.Code is OK, returns nil. func ( *spb.Status) error { return FromProto().Err() } // FromProto returns a Status representing s. func ( *spb.Status) *Status { return status.FromProto() } // FromError returns a Status representation of err. // // - If err was produced by this package or implements the method `GRPCStatus() // *Status`, the appropriate Status is returned. // // - If err is nil, a Status is returned with codes.OK and no message. // // - Otherwise, err is an error not compatible with this package. In this // case, a Status is returned with codes.Unknown and err's Error() message, // and ok is false. func ( error) ( *Status, bool) { if == nil { return nil, true } if , := .(interface { () *Status }); { return .(), true } return New(codes.Unknown, .Error()), false } // Convert is a convenience function which removes the need to handle the // boolean return value from FromError. func ( error) *Status { , := FromError() return } // Code returns the Code of the error if it is a Status error, codes.OK if err // is nil, or codes.Unknown otherwise. func ( error) codes.Code { // Don't use FromError to avoid allocation of OK status. if == nil { return codes.OK } if , := .(interface { () *Status }); { return .().Code() } return codes.Unknown } // FromContextError converts a context error or wrapped context error into a // Status. It returns a Status with codes.OK if err is nil, or a Status with // codes.Unknown if err is non-nil and not a context error. func ( error) *Status { if == nil { return nil } if errors.Is(, context.DeadlineExceeded) { return New(codes.DeadlineExceeded, .Error()) } if errors.Is(, context.Canceled) { return New(codes.Canceled, .Error()) } return New(codes.Unknown, .Error()) }