This repository was archived by the owner on Dec 19, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 77
Expand file tree
/
Copy pathgraph.go
More file actions
109 lines (94 loc) · 2.86 KB
/
Copy pathgraph.go
File metadata and controls
109 lines (94 loc) · 2.86 KB
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
103
104
105
106
107
108
109
package main
import (
"sort"
"github.com/dave/dst/gendst/data"
"github.com/dave/jennifer/jen"
)
const (
dstPath = "github.com/dave/dst"
)
// genNodeToGraphNode generates go code that converts a dst node to a golines library
// graph node. The latter can then be used to generate a dot file for debugging
// purposes.
func genNodeToGraphNode() error {
f := jen.NewFile("shorten")
f.HeaderComment("Generated by generate/main.go. DO NOT EDIT.")
// Sort the keys in the dst map so that output is in stable order
dataKeys := []string{}
for key := range data.Info {
dataKeys = append(dataKeys, key)
}
sort.Strings(dataKeys)
f.Func().Id("nodeToGraphNode").Params(
jen.Id("node").Qual(dstPath, "Node"),
).Op("*").Id("graphNode").BlockFunc(
func(g *jen.Group) {
g.Id("gNode").Op(":=").Op("&").Id("graphNode").Values(
jen.Id("Node").Op(":").Id("node"),
jen.Id("Edges").Op(":").Index().Op("*").Id("graphEdge").Values(),
)
g.Var().Id("child").Op("*").Id("graphNode")
g.Switch(jen.Id("n").Op(":=").Id("node").Assert(jen.Id("type"))).BlockFunc(
func(g *jen.Group) {
for _, key := range dataKeys {
parts := data.Info[key]
g.Case(jen.Op("*").Qual(dstPath, key)).BlockFunc(
func(g *jen.Group) {
g.Id("gNode").Dot("Type").Op("=").Lit(key)
for _, part := range parts {
switch p := part.(type) {
case data.Node:
g.If(p.Field.Get("n").Op("!=").Nil()).Block(
jen.Id("child").Op("=").Id("nodeToGraphNode").
Call(
p.Field.Get("n"),
),
jen.Id("gNode").Dot("Edges").Op("=").Append(
jen.Id("gNode").Dot("Edges"),
jen.Op("&").Id("graphEdge").Values(
jen.Id("Dest").Op(":").Id("child"),
jen.Id("Relationship").Op(":").Lit(p.Name),
),
),
)
case data.List:
g.If(p.Field.Get("n").Op("!=").Nil()).Block(
jen.For(
jen.List(jen.Id("_"), jen.Id("obj")).
Op(":=").Range().Add(p.Field.Get("n")),
).Block(
jen.Id("child").Op("=").Id("nodeToGraphNode").
Call(
jen.Id("obj"),
),
jen.Id("gNode").Dot("Edges").Op("=").Append(
jen.Id("gNode").Dot("Edges"),
jen.Op("&").Id("graphEdge").Values(
jen.Id("Dest").Op(":").Id("child"),
jen.Id("Relationship").Op(":").Lit(p.Name),
),
),
),
)
case data.String:
g.Id("gNode").Dot("Value").Op("=").Add(
p.ValueField.Get("n"),
)
}
}
},
)
}
g.Default().Block(
jen.Qual("log", "Println").Call(
jen.Lit("Unrecognized type"),
),
)
},
)
g.Return().Id("gNode")
},
)
f.Save("../shorten/graph_generated.go")
return nil
}