@@ -8,21 +8,92 @@ import (
8
8
"strings"
9
9
"syscall/js"
10
10
11
+ "oss.terrastruct.com/d2/d2ast"
11
12
"oss.terrastruct.com/d2/d2compiler"
12
13
"oss.terrastruct.com/d2/d2format"
14
+ "oss.terrastruct.com/d2/d2oracle"
13
15
"oss.terrastruct.com/d2/d2parser"
14
16
"oss.terrastruct.com/d2/d2target"
15
17
"oss.terrastruct.com/d2/lib/urlenc"
16
18
)
17
19
18
20
func main () {
21
+ js .Global ().Set ("d2GetRefRanges" , js .FuncOf (jsGetRefRanges ))
19
22
js .Global ().Set ("d2Compile" , js .FuncOf (jsCompile ))
20
23
js .Global ().Set ("d2Parse" , js .FuncOf (jsParse ))
21
24
js .Global ().Set ("d2Encode" , js .FuncOf (jsEncode ))
22
25
js .Global ().Set ("d2Decode" , js .FuncOf (jsDecode ))
23
26
select {}
24
27
}
25
28
29
+ type jsRefRanges struct {
30
+ Ranges []d2ast.Range `json:"ranges"`
31
+ ParseError string `json:"parseError"`
32
+ UserError string `json:"userError"`
33
+ D2Error string `json:"d2Error"`
34
+ }
35
+
36
+ func jsGetRefRanges (this js.Value , args []js.Value ) interface {} {
37
+ dsl := args [0 ].String ()
38
+ key := args [1 ].String ()
39
+
40
+ mk , err := d2parser .ParseMapKey (key )
41
+ if err != nil {
42
+ ret := jsRefRanges {D2Error : err .Error ()}
43
+ str , _ := json .Marshal (ret )
44
+ return string (str )
45
+ }
46
+
47
+ g , err := d2compiler .Compile ("" , strings .NewReader (dsl ), & d2compiler.CompileOptions {
48
+ UTF16 : true ,
49
+ })
50
+ var pe d2parser.ParseError
51
+ if err != nil {
52
+ if errors .As (err , & pe ) {
53
+ serialized , _ := json .Marshal (err )
54
+ // TODO
55
+ ret := jsRefRanges {ParseError : string (serialized )}
56
+ str , _ := json .Marshal (ret )
57
+ return string (str )
58
+ }
59
+ ret := jsRefRanges {D2Error : err .Error ()}
60
+ str , _ := json .Marshal (ret )
61
+ return string (str )
62
+ }
63
+
64
+ var ranges []d2ast.Range
65
+ if len (mk .Edges ) == 1 {
66
+ edge := d2oracle .GetEdge (g , key )
67
+ if edge == nil {
68
+ ret := jsRefRanges {D2Error : "edge not found" }
69
+ str , _ := json .Marshal (ret )
70
+ return string (str )
71
+ }
72
+
73
+ for _ , ref := range edge .References {
74
+ ranges = append (ranges , ref .MapKey .Range )
75
+ }
76
+ } else {
77
+ obj := d2oracle .GetObj (g , key )
78
+ if obj == nil {
79
+ ret := jsRefRanges {D2Error : "obj not found" }
80
+ str , _ := json .Marshal (ret )
81
+ return string (str )
82
+ }
83
+
84
+ for _ , ref := range obj .References {
85
+ ranges = append (ranges , ref .Key .Range )
86
+ }
87
+ }
88
+
89
+ resp := jsRefRanges {
90
+ Ranges : ranges ,
91
+ }
92
+
93
+ str , _ := json .Marshal (resp )
94
+ return string (str )
95
+ }
96
+
26
97
type jsObject struct {
27
98
Result string `json:"result"`
28
99
UserError string `json:"userError"`
0 commit comments