github.com/artyom/thrift@v0.0.0-20130902103359-388840a05deb/protocol.go (about)

     1  /*
     2   * Licensed to the Apache Software Foundation (ASF) under one
     3   * or more contributor license agreements. See the NOTICE file
     4   * distributed with this work for additional information
     5   * regarding copyright ownership. The ASF licenses this file
     6   * to you under the Apache License, Version 2.0 (the
     7   * "License"); you may not use this file except in compliance
     8   * with the License. You may obtain a copy of the License at
     9   *
    10   *   http://www.apache.org/licenses/LICENSE-2.0
    11   *
    12   * Unless required by applicable law or agreed to in writing,
    13   * software distributed under the License is distributed on an
    14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    15   * KIND, either express or implied. See the License for the
    16   * specific language governing permissions and limitations
    17   * under the License.
    18   */
    19  
    20  package thrift
    21  
    22  const (
    23  	VERSION_MASK = 0xffff0000
    24  	VERSION_1    = 0x80010000
    25  )
    26  
    27  type TProtocol interface {
    28  	WriteMessageBegin(name string, typeId TMessageType, seqid int32) error
    29  	WriteMessageEnd() error
    30  	WriteStructBegin(name string) error
    31  	WriteStructEnd() error
    32  	WriteFieldBegin(name string, typeId TType, id int16) error
    33  	WriteFieldEnd() error
    34  	WriteFieldStop() error
    35  	WriteMapBegin(keyType TType, valueType TType, size int) error
    36  	WriteMapEnd() error
    37  	WriteListBegin(elemType TType, size int) error
    38  	WriteListEnd() error
    39  	WriteSetBegin(elemType TType, size int) error
    40  	WriteSetEnd() error
    41  	WriteBool(value bool) error
    42  	WriteByte(value byte) error
    43  	WriteI16(value int16) error
    44  	WriteI32(value int32) error
    45  	WriteI64(value int64) error
    46  	WriteDouble(value float64) error
    47  	WriteString(value string) error
    48  	WriteBinary(value []byte) error
    49  
    50  	ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error)
    51  	ReadMessageEnd() error
    52  	ReadStructBegin() (name string, err error)
    53  	ReadStructEnd() error
    54  	ReadFieldBegin() (name string, typeId TType, id int16, err error)
    55  	ReadFieldEnd() error
    56  	ReadMapBegin() (keyType TType, valueType TType, size int, err error)
    57  	ReadMapEnd() error
    58  	ReadListBegin() (elemType TType, size int, err error)
    59  	ReadListEnd() error
    60  	ReadSetBegin() (elemType TType, size int, err error)
    61  	ReadSetEnd() error
    62  	ReadBool() (value bool, err error)
    63  	ReadByte() (value byte, err error)
    64  	ReadI16() (value int16, err error)
    65  	ReadI32() (value int32, err error)
    66  	ReadI64() (value int64, err error)
    67  	ReadDouble() (value float64, err error)
    68  	ReadString() (value string, err error)
    69  	ReadBinary() (value []byte, err error)
    70  
    71  	Skip(fieldType TType) (err error)
    72  	Flush() (err error)
    73  
    74  	Transport() TTransport
    75  }
    76  
    77  // The maximum recursive depth the skip() function will traverse
    78  var MaxSkipDepth = 1<<31 - 1
    79  
    80  // Skips over the next data element from the provided input TProtocol object.
    81  func SkipDefaultDepth(prot TProtocol, typeId TType) (err error) {
    82  	return Skip(prot, typeId, MaxSkipDepth)
    83  }
    84  
    85  // Skips over the next data element from the provided input TProtocol object.
    86  func Skip(self TProtocol, fieldType TType, maxDepth int) (err error) {
    87  	switch fieldType {
    88  	case STOP:
    89  		return
    90  	case BOOL:
    91  		_, err = self.ReadBool()
    92  		return
    93  	case BYTE:
    94  		_, err = self.ReadByte()
    95  		return
    96  	case I16:
    97  		_, err = self.ReadI16()
    98  		return
    99  	case I32:
   100  		_, err = self.ReadI32()
   101  		return
   102  	case I64:
   103  		_, err = self.ReadI64()
   104  		return
   105  	case DOUBLE:
   106  		_, err = self.ReadDouble()
   107  		return
   108  	case STRING:
   109  		_, err = self.ReadString()
   110  		return
   111  	case STRUCT:
   112  		if _, err = self.ReadStructBegin(); err != nil {
   113  			return err
   114  		}
   115  		for {
   116  			_, typeId, _, _ := self.ReadFieldBegin()
   117  			if typeId == STOP {
   118  				break
   119  			}
   120  			Skip(self, typeId, maxDepth-1)
   121  			self.ReadFieldEnd()
   122  		}
   123  		return self.ReadStructEnd()
   124  	case MAP:
   125  		keyType, valueType, size, err := self.ReadMapBegin()
   126  		if err != nil {
   127  			return err
   128  		}
   129  		for i := 0; i < size; i++ {
   130  			Skip(self, keyType, maxDepth-1)
   131  			self.Skip(valueType)
   132  		}
   133  		return self.ReadMapEnd()
   134  	case SET:
   135  		elemType, size, err := self.ReadSetBegin()
   136  		if err != nil {
   137  			return err
   138  		}
   139  		for i := 0; i < size; i++ {
   140  			Skip(self, elemType, maxDepth-1)
   141  		}
   142  		return self.ReadSetEnd()
   143  	case LIST:
   144  		elemType, size, err := self.ReadListBegin()
   145  		if err != nil {
   146  			return err
   147  		}
   148  		for i := 0; i < size; i++ {
   149  			Skip(self, elemType, maxDepth-1)
   150  		}
   151  		return self.ReadListEnd()
   152  	}
   153  	return nil
   154  }