// fileDescEncodingContainingSymbol finds the file descriptor containing the given symbol, // does marshalling on it and returns the marshalled result. // The given symbol can be a type, a service or a method. func (s *serverReflectionServer) fileDescEncodingContainingSymbol(name string) ([]byte, error) { var ( fd *dpb.FileDescriptorProto ) // Check if it's a type name. if st, err := s.typeForName(name); err == nil { fd, err = s.fileDescForType(st) if err != nil { return nil, err } } else { // Check if it's a service name or a method name. meta, err := s.serviceMetadataForSymbol(name) // Metadata not found. if err != nil { return nil, err } // Metadata not valid. fileNameForMeta, ok := meta.(string) if !ok { return nil, fmt.Errorf("invalid file descriptor for symbol: %v", name) } enc := proto.FileDescriptor(fileNameForMeta) fd, err = s.decodeFileDesc(enc) if err != nil { return nil, err } } return proto.Marshal(fd) }
// fileDescEncodingByFilename finds the file descriptor for given filename, // does marshalling on it and returns the marshalled result. func (s *serverReflectionServer) fileDescEncodingByFilename(name string) ([]byte, error) { enc := proto.FileDescriptor(name) if enc == nil { return nil, fmt.Errorf("unknown file: %v", name) } fd, err := s.decodeFileDesc(enc) if err != nil { return nil, err } return proto.Marshal(fd) }
func loadFileDesc(filename string) (*dpb.FileDescriptorProto, []byte) { enc := proto.FileDescriptor(filename) if enc == nil { panic(fmt.Sprintf("failed to find fd for file: %v", filename)) } fd, err := s.decodeFileDesc(enc) if err != nil { panic(fmt.Sprintf("failed to decode enc: %v", err)) } b, err := proto.Marshal(fd) if err != nil { panic(fmt.Sprintf("failed to marshal fd: %v", err)) } return fd, b }