github.com/gopacket/gopacket@v1.1.0/gen.go (about)

     1  // Copyright 2019 The GoPacket Authors. All rights reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style license
     4  // that can be found in the LICENSE file in the root of the source
     5  // tree.
     6  
     7  //go:build ignore
     8  // +build ignore
     9  
    10  // This file generates LayersDecoder function for DecodingLayerContainer
    11  // go run gen.go | gofmt > layers_decoder.go
    12  package main
    13  
    14  import (
    15  	"fmt"
    16  	"os"
    17  	"time"
    18  )
    19  
    20  const headerFmt = `// Copyright 2019 The GoPacket Authors. All rights reserved.
    21  
    22  package gopacket
    23  
    24  // Created by gen.go, don't edit manually
    25  // Generated at %s
    26  
    27  // LayersDecoder returns DecodingLayerFunc for specified
    28  // DecodingLayerContainer, LayerType value to start decoding with and
    29  // some DecodeFeedback.
    30  func LayersDecoder(dl DecodingLayerContainer, first LayerType, df DecodeFeedback) DecodingLayerFunc {
    31    firstDec, ok := dl.Decoder(first)
    32    if !ok {
    33      return func([]byte, *[]LayerType) (LayerType, error) {
    34        return first, nil
    35      }
    36    }
    37  `
    38  
    39  var funcBody = `return func(data []byte, decoded *[]LayerType) (LayerType, error) {
    40    *decoded = (*decoded)[:0] // Truncated decoded layers.
    41    typ := first
    42    decoder := firstDec
    43    for {
    44      if err := decoder.DecodeFromBytes(data, df); err != nil {
    45        return LayerTypeZero, err
    46      }
    47      *decoded = append(*decoded, typ)
    48      typ = decoder.NextLayerType()
    49      if data = decoder.LayerPayload(); len(data) == 0 {
    50        break
    51      }
    52      if decoder, ok = dlc.Decoder(typ); !ok {
    53        return typ, nil
    54      }
    55    }
    56    return LayerTypeZero, nil
    57  }`
    58  
    59  func main() {
    60  	fmt.Fprintf(os.Stderr, "Writing results to stdout\n")
    61  	types := []string{
    62  		"DecodingLayerSparse",
    63  		"DecodingLayerArray",
    64  		"DecodingLayerMap",
    65  	}
    66  
    67  	fmt.Printf(headerFmt, time.Now())
    68  	for _, t := range types {
    69  		fmt.Printf("if dlc, ok := dl.(%s); ok {", t)
    70  		fmt.Println(funcBody)
    71  		fmt.Println("}")
    72  	}
    73  	fmt.Println("dlc := dl")
    74  	fmt.Println(funcBody)
    75  	fmt.Println("}")
    76  }