| // 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. |
| |
| // +build ignore |
| |
| // This binary handles creating string constants and function templates for enums. |
| // |
| // go run gen.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/google/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 { |
| return {{.Name}}Metadata[a].DecodeWith.Decode(data, p) |
| } |
| // String returns {{.Name}}Metadata.Name. |
| func (a {{.Name}}) String() string { |
| return {{.Name}}Metadata[a].Name |
| } |
| // LayerType returns {{.Name}}Metadata.LayerType. |
| func (a {{.Name}}) LayerType() gopacket.LayerType { |
| return {{.Name}}Metadata[a].LayerType |
| } |
| |
| type errorDecoderFor{{.Name}} int |
| func (a *errorDecoderFor{{.Name}}) Decode(data []byte, p gopacket.PacketBuilder) error { |
| return a |
| } |
| func (a *errorDecoderFor{{.Name}}) Error() string { |
| return fmt.Sprintf("Unable to decode {{.Name}} %d", int(*a)) |
| } |
| |
| var errorDecodersFor{{.Name}} [{{.Num}}]errorDecoderFor{{.Name}} |
| var {{.Name}}Metadata [{{.Num}}]EnumMetadata |
| |
| func initUnknownTypesFor{{.Name}}() { |
| for i := 0; i < {{.Num}}; i++ { |
| errorDecodersFor{{.Name}}[i] = errorDecoderFor{{.Name}}(i) |
| {{.Name}}Metadata[i] = EnumMetadata{ |
| DecodeWith: &errorDecodersFor{{.Name}}[i], |
| Name: "Unknown{{.Name}}", |
| } |
| } |
| } |
| `)) |
| |
| func main() { |
| fmt.Fprintf(os.Stderr, "Writing results to stdout\n") |
| fmt.Printf(fmtString, time.Now()) |
| types := []struct { |
| Name string |
| Num int |
| }{ |
| {"LinkType", 256}, |
| {"EthernetType", 65536}, |
| {"PPPType", 65536}, |
| {"IPProtocol", 256}, |
| {"SCTPChunkType", 256}, |
| {"PPPoECode", 256}, |
| {"FDDIFrameControl", 256}, |
| {"EAPOLType", 256}, |
| {"ProtocolFamily", 256}, |
| {"Dot11Type", 256}, |
| {"USBTransportType", 256}, |
| } |
| |
| fmt.Println("func init() {") |
| for _, t := range types { |
| fmt.Printf("initUnknownTypesFor%s()\n", t.Name) |
| } |
| 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) |
| } |
| } |
| } |