1//go:build !js || !wasm23package main45import (6 "context"7 "fmt"8 "os"910 "oss.terrastruct.com/d2/d2graph"11 "oss.terrastruct.com/d2/d2layouts/d2dagrelayout"12 "oss.terrastruct.com/d2/d2lib"13 "oss.terrastruct.com/d2/d2renderers/d2svg"14 "oss.terrastruct.com/d2/lib/textmeasure"15)1617func dagreLayoutResolver(engine string) (d2graph.LayoutGraph, error) {18 if engine != "dagre" {19 return nil, fmt.Errorf("unexpected layout %q", engine)20 }21 return func(ctx context.Context, graph *d2graph.Graph) error {22 return d2dagrelayout.Layout(ctx, graph, nil)23 }, nil24}2526func main() {27 input := "x -> y\nsteps: {\n 1: {\n x -> z\n }\n}"28 layout := "dagre"29 pad := int64(50)30 ruler, err := textmeasure.NewRuler()31 if err != nil {32 panic(err)33 }34 d, graph, err := d2lib.Compile(context.Background(), input, &d2lib.CompileOptions{35 Layout: &layout,36 Ruler: ruler,37 LayoutResolver: dagreLayoutResolver,38 }, &d2svg.RenderOpts{Pad: &pad})39 if err != nil {40 panic(err)41 }42 fmt.Printf("shapes=%d connections=%d\n", len(d.Shapes), len(d.Connections))43 for _, o := range graph.Objects {44 fmt.Printf("obj=%s box=%v\n", o.ID, o.Box)45 }46 for _, c := range d.Connections {47 fmt.Printf("route=%d src=%s dst=%s\n", len(c.Route), c.Src, c.Dst)48 }49 if err := os.WriteFile("/tmp/d2-custom.svg", func() []byte {50 b, e := d2svg.Render(d, &d2svg.RenderOpts{Pad: &pad})51 if e != nil {52 panic(e)53 }54 return b55 }(), 0644); err != nil {56 panic(err)57 }58 fmt.Printf("layers=%d scenarios=%d steps=%d\n", len(d.Layers), len(d.Scenarios), len(d.Steps))59}