func dotSVG()

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
}