1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
// Copyright 2012 Google, Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file in the root of the source
// tree.
//go:build ignore
// +build ignore
// This binary handles creating string constants and function templates for enums.
//
// go run gen2.go | gofmt > enums_generated.go
package main
import (
"fmt"
"log"
"os"
"text/template"
"time"
)
const fmtString = `// Copyright 2012 Google, Inc. All rights reserved.
package layers
// Created by gen2.go, don't edit manually
// Generated at %s
import (
"fmt"
"github.com/gopacket/gopacket"
)
`
var funcsTmpl = template.Must(template.New("foo").Parse(`
// Decoder calls {{.Name}}Metadata.DecodeWith's decoder.
func (a {{.Name}}) Decode(data []byte, p gopacket.PacketBuilder) error {
if int(a) < {{.Num}} {
if metadata := {{.Name}}Metadata[a]; metadata.DecodeWith != nil {
return metadata.DecodeWith.Decode(data, p)
}
}
return fmt.Errorf("Unable to decode {{.Name}} %d", a)
}
// String returns {{.Name}}Metadata.Name.
func (a {{.Name}}) String() string {
if int(a) < {{.Num}} {
if metadata := {{.Name}}Metadata[a]; metadata.DecodeWith != nil {
return metadata.Name
}
}
return "Unknown{{.Name}}"
}
// LayerType returns {{.Name}}Metadata.LayerType.
func (a {{.Name}}) LayerType() gopacket.LayerType {
if int(a) < {{.Num}} {
if metadata := {{.Name}}Metadata[a]; metadata.DecodeWith != nil {
return metadata.LayerType
}
}
return 0
}
var {{.Name}}Metadata [{{.Num}}]EnumMetadata
`))
func main() {
fmt.Fprintf(os.Stderr, "Writing results to stdout\n")
fmt.Printf(fmtString, time.Now())
types := []struct {
Name string
Num int
}{
{"LinkType", 277},
{"EthernetType", 65536},
{"PPPType", 65536},
{"IPProtocol", 256},
{"SCTPChunkType", 256},
{"PPPoECode", 256},
{"FDDIFrameControl", 256},
{"EAPOLType", 256},
{"ProtocolFamily", 256},
{"Dot11Type", 256},
{"USBTransportType", 256},
}
fmt.Println("func init() {")
fmt.Println("initActualTypeData()")
fmt.Println("}")
for _, t := range types {
if err := funcsTmpl.Execute(os.Stdout, t); err != nil {
log.Fatalf("Failed to execute template %s: %v", t.Name, err)
}
}
}
|