diff --git a/d2oracle/edit_test.go b/d2oracle/edit_test.go index 472e07d0c..aece05656 100644 --- a/d2oracle/edit_test.go +++ b/d2oracle/edit_test.go @@ -470,7 +470,7 @@ layers: { } `, key: `b`, - boardPath: []string{"root", "layers", "x"}, + boardPath: []string{"x"}, expKey: `b`, exp: `a @@ -495,7 +495,7 @@ layers: { } `, key: `a -> b`, - boardPath: []string{"root", "layers", "x"}, + boardPath: []string{"x"}, expKey: `(a -> b)[0]`, exp: `a @@ -520,7 +520,7 @@ layers: { } `, key: `a -> b`, - boardPath: []string{"root", "layers", "x"}, + boardPath: []string{"x"}, expKey: `(a -> b)[1]`, exp: `a -> b @@ -546,7 +546,7 @@ scenarios: { } `, key: `c`, - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, expKey: `c`, exp: `a @@ -573,7 +573,7 @@ scenarios: { } `, key: `a -> b`, - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, expKey: `(a -> b)[0]`, exp: `a @@ -599,7 +599,7 @@ scenarios: { } `, key: `a -> b`, - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, expKey: `(a -> b)[1]`, exp: `a -> b @@ -625,7 +625,7 @@ steps: { } `, key: `c`, - boardPath: []string{"root", "steps", "x"}, + boardPath: []string{"x"}, expKey: `c`, exp: `a @@ -652,7 +652,7 @@ steps: { } `, key: `d -> b`, - boardPath: []string{"root", "steps", "x"}, + boardPath: []string{"x"}, expKey: `(d -> b)[0]`, exp: `a @@ -679,7 +679,7 @@ steps: { } `, key: `d`, - boardPath: []string{"root", "steps", "x"}, + boardPath: []string{"x"}, expKey: `d 2`, exp: `a @@ -1721,7 +1721,7 @@ layers: { `, key: `a.style.opacity`, value: go2.Pointer(`0.2`), - boardPath: []string{"root", "layers", "x"}, + boardPath: []string{"x"}, exp: `a @@ -1745,7 +1745,7 @@ layers: { `, key: `a.style.opacity`, value: go2.Pointer(`0.2`), - boardPath: []string{"root", "layers", "x"}, + boardPath: []string{"x"}, exp: `a @@ -1770,7 +1770,7 @@ scenarios: { `, key: `a.style.opacity`, value: go2.Pointer(`0.2`), - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, exp: `a: outer @@ -1798,7 +1798,7 @@ scenarios: { `, key: `a.b.style.opacity`, value: go2.Pointer(`0.2`), - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, exp: `a: { b: outer @@ -1826,7 +1826,7 @@ scenarios: { `, key: `a.style.opacity`, value: go2.Pointer(`0.2`), - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, exp: `a @@ -1855,7 +1855,7 @@ scenarios: { `, key: `a`, value: go2.Pointer(`b`), - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, exp: `a: { style.opacity: 0.2 @@ -1885,7 +1885,7 @@ scenarios: { `, key: `a`, value: go2.Pointer(`b`), - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, exp: `a: { style.opacity: 0.2 @@ -4880,7 +4880,7 @@ layers: { `, key: `c`, newKey: `b.c`, - boardPath: []string{"root", "layers", "x"}, + boardPath: []string{"x"}, exp: `a @@ -4907,7 +4907,7 @@ scenarios: { `, key: `a`, newKey: `b.a`, - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, expErr: `failed to move: "a" to "b.a": operation would modify AST outside of given scope`, }, @@ -6612,7 +6612,7 @@ layers: { } `, key: `c`, - boardPath: []string{"root", "layers", "x"}, + boardPath: []string{"x"}, exp: `a @@ -6636,7 +6636,7 @@ scenarios: { } `, key: `c`, - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, exp: `a @@ -6660,7 +6660,7 @@ scenarios: { } `, key: `a`, - boardPath: []string{"root", "scenarios", "x"}, + boardPath: []string{"x"}, expErr: `failed to delete "a": operation would modify AST outside of given scope`, }, diff --git a/d2oracle/get.go b/d2oracle/get.go index c17bbbb54..e3c8b5b4f 100644 --- a/d2oracle/get.go +++ b/d2oracle/get.go @@ -13,41 +13,21 @@ func GetBoardGraph(g *d2graph.Graph, boardPath []string) *d2graph.Graph { if len(boardPath) == 0 { return g } - switch boardPath[0] { - case "root": - if g.Parent == nil { - return GetBoardGraph(g, boardPath[1:]) - } - return nil - case "layers": - if len(boardPath) < 2 { - return nil - } - for i, b := range g.Layers { - if b.Name == boardPath[1] { - return GetBoardGraph(g.Layers[i], boardPath[2:]) - } - } - case "scenarios": - if len(boardPath) < 2 { - return nil - } - for i, b := range g.Scenarios { - if b.Name == boardPath[1] { - return GetBoardGraph(g.Scenarios[i], boardPath[2:]) - } - } - case "steps": - if len(boardPath) < 2 { - return nil - } - for i, b := range g.Steps { - if b.Name == boardPath[1] { - return GetBoardGraph(g.Steps[i], boardPath[2:]) - } + for i, b := range g.Layers { + if b.Name == boardPath[0] { + return GetBoardGraph(g.Layers[i], boardPath[1:]) + } + } + for i, b := range g.Scenarios { + if b.Name == boardPath[0] { + return GetBoardGraph(g.Scenarios[i], boardPath[1:]) + } + } + for i, b := range g.Steps { + if b.Name == boardPath[0] { + return GetBoardGraph(g.Steps[i], boardPath[1:]) } } - return nil } @@ -55,44 +35,52 @@ func ReplaceBoardNode(ast, ast2 *d2ast.Map, boardPath []string) bool { if len(boardPath) == 0 { return false } - switch boardPath[0] { - case "root": - return ReplaceBoardNode(ast, ast2, boardPath[1:]) - case "layers": - if len(boardPath) < 2 { - return false - } - for _, n := range ast.Nodes { - if n.MapKey != nil && n.MapKey.Key != nil && n.MapKey.Key.Path[0].Unbox().ScalarString() == "layers" { - return ReplaceBoardNode(n.MapKey.Value.Map, ast2, boardPath[1:]) + + findMap := func(root *d2ast.Map, name string) *d2ast.Map { + for _, n := range root.Nodes { + if n.MapKey != nil && n.MapKey.Key != nil && n.MapKey.Key.Path[0].Unbox().ScalarString() == name { + return n.MapKey.Value.Map } } - case "scenarios": - if len(boardPath) < 2 { - return false - } - for _, n := range ast.Nodes { - if n.MapKey != nil && n.MapKey.Key != nil && n.MapKey.Key.Path[0].Unbox().ScalarString() == "scenarios" { - return ReplaceBoardNode(n.MapKey.Value.Map, ast2, boardPath[1:]) + return nil + } + + layersMap := findMap(ast, "layers") + scenariosMap := findMap(ast, "scenarios") + stepsMap := findMap(ast, "steps") + + if layersMap != nil { + m := findMap(layersMap, boardPath[0]) + if m != nil { + if len(boardPath) > 1 { + return ReplaceBoardNode(m, ast2, boardPath[1:]) + } else { + m.Nodes = ast2.Nodes + return true } } - case "steps": - if len(boardPath) < 2 { - return false - } - for _, n := range ast.Nodes { - if n.MapKey != nil && n.MapKey.Key != nil && n.MapKey.Key.Path[0].Unbox().ScalarString() == "steps" { - return ReplaceBoardNode(n.MapKey.Value.Map, ast2, boardPath[1:]) + } + + if scenariosMap != nil { + m := findMap(scenariosMap, boardPath[0]) + if m != nil { + if len(boardPath) > 1 { + return ReplaceBoardNode(m, ast2, boardPath[1:]) + } else { + m.Nodes = ast2.Nodes + return true } } - default: - for _, n := range ast.Nodes { - if n.MapKey != nil && n.MapKey.Key != nil && n.MapKey.Key.Path[0].Unbox().ScalarString() == boardPath[0] { - if len(boardPath) == 1 { - n.MapKey.Value.Map.Nodes = ast2.Nodes - return true - } - return ReplaceBoardNode(n.MapKey.Value.Map, ast2, boardPath[1:]) + } + + if stepsMap != nil { + m := findMap(stepsMap, boardPath[0]) + if m != nil { + if len(boardPath) > 1 { + return ReplaceBoardNode(m, ast2, boardPath[1:]) + } else { + m.Nodes = ast2.Nodes + return true } } }