google.golang.org/grpc@v1.62.1/reflection/adapt.go (about)

     1  /*
     2   *
     3   * Copyright 2023 gRPC authors.
     4   *
     5   * Licensed under the Apache License, Version 2.0 (the "License");
     6   * you may not use this file except in compliance with the License.
     7   * You may obtain a copy of the License at
     8   *
     9   *     http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   *
    17   */
    18  
    19  package reflection
    20  
    21  import (
    22  	v1reflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1"
    23  	v1reflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1"
    24  	v1alphareflectiongrpc "google.golang.org/grpc/reflection/grpc_reflection_v1alpha"
    25  	v1alphareflectionpb "google.golang.org/grpc/reflection/grpc_reflection_v1alpha"
    26  )
    27  
    28  // asV1Alpha returns an implementation of the v1alpha version of the reflection
    29  // interface that delegates all calls to the given v1 version.
    30  func asV1Alpha(svr v1reflectiongrpc.ServerReflectionServer) v1alphareflectiongrpc.ServerReflectionServer {
    31  	return v1AlphaServerImpl{svr: svr}
    32  }
    33  
    34  type v1AlphaServerImpl struct {
    35  	svr v1reflectiongrpc.ServerReflectionServer
    36  }
    37  
    38  func (s v1AlphaServerImpl) ServerReflectionInfo(stream v1alphareflectiongrpc.ServerReflection_ServerReflectionInfoServer) error {
    39  	return s.svr.ServerReflectionInfo(v1AlphaServerStreamAdapter{stream})
    40  }
    41  
    42  type v1AlphaServerStreamAdapter struct {
    43  	v1alphareflectiongrpc.ServerReflection_ServerReflectionInfoServer
    44  }
    45  
    46  func (s v1AlphaServerStreamAdapter) Send(response *v1reflectionpb.ServerReflectionResponse) error {
    47  	return s.ServerReflection_ServerReflectionInfoServer.Send(v1ToV1AlphaResponse(response))
    48  }
    49  
    50  func (s v1AlphaServerStreamAdapter) Recv() (*v1reflectionpb.ServerReflectionRequest, error) {
    51  	resp, err := s.ServerReflection_ServerReflectionInfoServer.Recv()
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  	return v1AlphaToV1Request(resp), nil
    56  }
    57  
    58  func v1ToV1AlphaResponse(v1 *v1reflectionpb.ServerReflectionResponse) *v1alphareflectionpb.ServerReflectionResponse {
    59  	var v1alpha v1alphareflectionpb.ServerReflectionResponse
    60  	v1alpha.ValidHost = v1.ValidHost
    61  	if v1.OriginalRequest != nil {
    62  		v1alpha.OriginalRequest = v1ToV1AlphaRequest(v1.OriginalRequest)
    63  	}
    64  	switch mr := v1.MessageResponse.(type) {
    65  	case *v1reflectionpb.ServerReflectionResponse_FileDescriptorResponse:
    66  		if mr != nil {
    67  			v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_FileDescriptorResponse{
    68  				FileDescriptorResponse: &v1alphareflectionpb.FileDescriptorResponse{
    69  					FileDescriptorProto: mr.FileDescriptorResponse.GetFileDescriptorProto(),
    70  				},
    71  			}
    72  		}
    73  	case *v1reflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse:
    74  		if mr != nil {
    75  			v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_AllExtensionNumbersResponse{
    76  				AllExtensionNumbersResponse: &v1alphareflectionpb.ExtensionNumberResponse{
    77  					BaseTypeName:    mr.AllExtensionNumbersResponse.GetBaseTypeName(),
    78  					ExtensionNumber: mr.AllExtensionNumbersResponse.GetExtensionNumber(),
    79  				},
    80  			}
    81  		}
    82  	case *v1reflectionpb.ServerReflectionResponse_ListServicesResponse:
    83  		if mr != nil {
    84  			svcs := make([]*v1alphareflectionpb.ServiceResponse, len(mr.ListServicesResponse.GetService()))
    85  			for i, svc := range mr.ListServicesResponse.GetService() {
    86  				svcs[i] = &v1alphareflectionpb.ServiceResponse{
    87  					Name: svc.GetName(),
    88  				}
    89  			}
    90  			v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ListServicesResponse{
    91  				ListServicesResponse: &v1alphareflectionpb.ListServiceResponse{
    92  					Service: svcs,
    93  				},
    94  			}
    95  		}
    96  	case *v1reflectionpb.ServerReflectionResponse_ErrorResponse:
    97  		if mr != nil {
    98  			v1alpha.MessageResponse = &v1alphareflectionpb.ServerReflectionResponse_ErrorResponse{
    99  				ErrorResponse: &v1alphareflectionpb.ErrorResponse{
   100  					ErrorCode:    mr.ErrorResponse.GetErrorCode(),
   101  					ErrorMessage: mr.ErrorResponse.GetErrorMessage(),
   102  				},
   103  			}
   104  		}
   105  	default:
   106  		// no value set
   107  	}
   108  	return &v1alpha
   109  }
   110  
   111  func v1AlphaToV1Request(v1alpha *v1alphareflectionpb.ServerReflectionRequest) *v1reflectionpb.ServerReflectionRequest {
   112  	var v1 v1reflectionpb.ServerReflectionRequest
   113  	v1.Host = v1alpha.Host
   114  	switch mr := v1alpha.MessageRequest.(type) {
   115  	case *v1alphareflectionpb.ServerReflectionRequest_FileByFilename:
   116  		v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileByFilename{
   117  			FileByFilename: mr.FileByFilename,
   118  		}
   119  	case *v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol:
   120  		v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingSymbol{
   121  			FileContainingSymbol: mr.FileContainingSymbol,
   122  		}
   123  	case *v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension:
   124  		if mr.FileContainingExtension != nil {
   125  			v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_FileContainingExtension{
   126  				FileContainingExtension: &v1reflectionpb.ExtensionRequest{
   127  					ContainingType:  mr.FileContainingExtension.GetContainingType(),
   128  					ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(),
   129  				},
   130  			}
   131  		}
   132  	case *v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType:
   133  		v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{
   134  			AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType,
   135  		}
   136  	case *v1alphareflectionpb.ServerReflectionRequest_ListServices:
   137  		v1.MessageRequest = &v1reflectionpb.ServerReflectionRequest_ListServices{
   138  			ListServices: mr.ListServices,
   139  		}
   140  	default:
   141  		// no value set
   142  	}
   143  	return &v1
   144  }
   145  
   146  func v1ToV1AlphaRequest(v1 *v1reflectionpb.ServerReflectionRequest) *v1alphareflectionpb.ServerReflectionRequest {
   147  	var v1alpha v1alphareflectionpb.ServerReflectionRequest
   148  	v1alpha.Host = v1.Host
   149  	switch mr := v1.MessageRequest.(type) {
   150  	case *v1reflectionpb.ServerReflectionRequest_FileByFilename:
   151  		if mr != nil {
   152  			v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileByFilename{
   153  				FileByFilename: mr.FileByFilename,
   154  			}
   155  		}
   156  	case *v1reflectionpb.ServerReflectionRequest_FileContainingSymbol:
   157  		if mr != nil {
   158  			v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingSymbol{
   159  				FileContainingSymbol: mr.FileContainingSymbol,
   160  			}
   161  		}
   162  	case *v1reflectionpb.ServerReflectionRequest_FileContainingExtension:
   163  		if mr != nil {
   164  			v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_FileContainingExtension{
   165  				FileContainingExtension: &v1alphareflectionpb.ExtensionRequest{
   166  					ContainingType:  mr.FileContainingExtension.GetContainingType(),
   167  					ExtensionNumber: mr.FileContainingExtension.GetExtensionNumber(),
   168  				},
   169  			}
   170  		}
   171  	case *v1reflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType:
   172  		if mr != nil {
   173  			v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_AllExtensionNumbersOfType{
   174  				AllExtensionNumbersOfType: mr.AllExtensionNumbersOfType,
   175  			}
   176  		}
   177  	case *v1reflectionpb.ServerReflectionRequest_ListServices:
   178  		if mr != nil {
   179  			v1alpha.MessageRequest = &v1alphareflectionpb.ServerReflectionRequest_ListServices{
   180  				ListServices: mr.ListServices,
   181  			}
   182  		}
   183  	default:
   184  		// no value set
   185  	}
   186  	return &v1alpha
   187  }