in cmd/resgraph/viz/main.go [190:249]
func dotSVG(text string) (string, error) {
klog.Infof("dotSVG: %q", text)
cmd := coreexec.Command(flags.dotExec, "-Tsvg")
inPipe, err := cmd.StdinPipe()
if err != nil {
klog.Errorf("dotSVG: StdinPipe = %v", err)
return "", err
}
outPipe, err := cmd.StdoutPipe()
if err != nil {
klog.Errorf("dotSVG: StdoutPipe = %v", err)
return "", err
}
errPipe, err := cmd.StderrPipe()
if err != nil {
klog.Errorf("dotSVG: StderrPipe = %v", err)
return "", err
}
var cmdErr error
cmdDone := make(chan struct{})
go func() {
cmdErr = cmd.Run()
if err != nil {
klog.Errorf("dotSVG: cmd.Run() = %v", cmdErr)
}
close(cmdDone)
}()
n, err := inPipe.Write([]byte(text))
inPipe.Close()
klog.Infof("dotSVG: Write() = %d, %v", n, err)
bytes, err := io.ReadAll(outPipe)
if err != nil {
klog.Errorf("dotSVG: ReadAll(outPipe) = %v", err)
}
errBytes, err := io.ReadAll(errPipe)
klog.Infof("dotSVG: ReadAll(errPipe) = %v (%q)", err, string(errBytes))
<-cmdDone
if cmdErr != nil {
return "", cmdErr
}
// Trim off some of the extra stuff in the output of dot.
svgText := string(bytes)
start := strings.Index(svgText, "<svg")
if start != -1 {
svgText = svgText[start:]
}
return svgText, nil
}