@@ -11,13 +11,15 @@ import (
11
11
"oss.terrastruct.com/d2/d2ast"
12
12
"oss.terrastruct.com/d2/d2compiler"
13
13
"oss.terrastruct.com/d2/d2format"
14
+ "oss.terrastruct.com/d2/d2graph"
14
15
"oss.terrastruct.com/d2/d2oracle"
15
16
"oss.terrastruct.com/d2/d2parser"
16
17
"oss.terrastruct.com/d2/d2target"
17
18
"oss.terrastruct.com/d2/lib/urlenc"
18
19
)
19
20
20
21
func main () {
22
+ js .Global ().Set ("d2GetObjOrder" , js .FuncOf (jsGetObjOrder ))
21
23
js .Global ().Set ("d2GetRefRanges" , js .FuncOf (jsGetRefRanges ))
22
24
js .Global ().Set ("d2Compile" , js .FuncOf (jsCompile ))
23
25
js .Global ().Set ("d2Parse" , js .FuncOf (jsParse ))
@@ -26,6 +28,61 @@ func main() {
26
28
select {}
27
29
}
28
30
31
+ type jsObjOrder struct {
32
+ Order []string `json:"order"`
33
+ Error string `json:"error"`
34
+ }
35
+
36
+ func jsGetObjOrder (this js.Value , args []js.Value ) interface {} {
37
+ dsl := args [0 ].String ()
38
+
39
+ g , err := d2compiler .Compile ("" , strings .NewReader (dsl ), & d2compiler.CompileOptions {
40
+ UTF16 : true ,
41
+ })
42
+ if err != nil {
43
+ ret := jsObjOrder {Error : err .Error ()}
44
+ str , _ := json .Marshal (ret )
45
+ return string (str )
46
+ }
47
+
48
+ var order []string
49
+
50
+ queue := []string {"" }
51
+ for len (queue ) > 0 {
52
+ curr := queue [0 ]
53
+ queue = queue [1 :]
54
+ var obj * d2graph.Object
55
+ if curr == "" {
56
+ obj = g .Root
57
+ } else {
58
+ mk , err := d2parser .ParseMapKey (curr )
59
+ if err != nil {
60
+ ret := jsObjOrder {Error : err .Error ()}
61
+ str , _ := json .Marshal (ret )
62
+ return string (str )
63
+ }
64
+ var ok bool
65
+ obj , ok = g .Root .HasChild (d2graph .Key (mk .Key ))
66
+ if ! ok {
67
+ ret := jsObjOrder {Error : "not found" }
68
+ str , _ := json .Marshal (ret )
69
+ return string (str )
70
+ }
71
+ }
72
+ order = append (order , obj .AbsID ())
73
+ for _ , ch := range obj .ChildrenArray {
74
+ queue = append (queue , ch .AbsID ())
75
+ }
76
+ }
77
+
78
+ resp := jsObjOrder {
79
+ Order : order ,
80
+ }
81
+
82
+ str , _ := json .Marshal (resp )
83
+ return string (str )
84
+ }
85
+
29
86
type jsRefRanges struct {
30
87
Ranges []d2ast.Range `json:"ranges"`
31
88
ParseError string `json:"parseError"`
0 commit comments