Skip to content

Commit

Permalink
簡易的なmermade生成
Browse files Browse the repository at this point in the history
  • Loading branch information
mazrean committed Nov 3, 2023
1 parent 2910fc5 commit 523928a
Showing 1 changed file with 43 additions and 8 deletions.
51 changes: 43 additions & 8 deletions cmd/isutools/dbdoc.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,11 @@ func dbDoc(args []string) error {

nodes := buildGraph(funcs)

for _, node := range nodes {
fmt.Printf("%s: %d\n", node.label, node.nodeType)
for _, edge := range node.edges {
fmt.Printf(" %s: %s\n", edge.label, edge.node.id)
}
mermaid, err := writeMermaid(nodes)
if err != nil {
return fmt.Errorf("failed to write mermaid: %w", err)
}
println(mermaid)

return nil
}
Expand Down Expand Up @@ -296,7 +295,7 @@ func buildFuncs(fset *token.FileSet, pkgs []*packages.Package, ssaProgram *ssa.P
continue
}

funcName := strings.Replace(def.FullName(), pkg.Module.Path, "", 1)
funcName := strings.TrimPrefix(strings.Replace(def.FullName(), pkg.Module.Path, "", 1), ".")
funcs = append(funcs, function{
id: def.Id(),
name: funcName,
Expand Down Expand Up @@ -572,7 +571,7 @@ func buildGraph(funcs []function) []*node {
}

edges = append(edges, tmpEdge{
label: q.table,
label: "",
edgeType: edgeType,
childID: tableID(q.table),
})
Expand All @@ -581,7 +580,7 @@ func buildGraph(funcs []function) []*node {
for _, c := range f.calls {
id := funcID(c)
edges = append(edges, tmpEdge{
label: c,
label: "",
edgeType: edgeTypeCall,
childID: id,
})
Expand Down Expand Up @@ -681,3 +680,39 @@ func funcID(functionID string) string {
func tableID(table string) string {
return fmt.Sprintf("table:%s", table)
}

const (
mermaidHeader = "# DB Graph\n```mermaid\ngraph LR\n"
mermaidFooter = "```"
)

func writeMermaid(nodes []*node) (string, error) {
sb := &strings.Builder{}
_, err := sb.WriteString(mermaidHeader)
if err != nil {
return "", fmt.Errorf("failed to write header: %w", err)
}

for _, node := range nodes {
for _, edge := range node.edges {
if edge.label == "" {
_, err = sb.WriteString(fmt.Sprintf(" %s[%s] --> %s[%s]\n", node.id, node.label, edge.node.id, edge.node.label))
if err != nil {
return "", fmt.Errorf("failed to write edge: %w\n", err)
}
} else {
_, err = sb.WriteString(fmt.Sprintf(" %s[%s] -- %s --> %s[%s]\n", node.id, node.label, edge.label, edge.node.id, edge.node.label))
if err != nil {
return "", fmt.Errorf("failed to write edge: %w\n", err)
}
}
}
}

_, err = sb.WriteString(mermaidFooter)
if err != nil {
return "", fmt.Errorf("failed to write footer: %w", err)
}

return sb.String(), nil
}

0 comments on commit 523928a

Please sign in to comment.