Merge pull request #1348 from alixander/rename-return-key

d2oracle: return newkey in rename
This commit is contained in:
Alexander Wang 2023-05-27 17:32:15 -07:00 committed by GitHub
commit 69ee4a9033
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 8 deletions

View file

@ -1309,12 +1309,12 @@ func ensureNode(g *d2graph.Graph, excludedEdges []*d2ast.Edge, scopeObj *d2graph
} }
} }
func Rename(g *d2graph.Graph, key, newName string) (_ *d2graph.Graph, err error) { func Rename(g *d2graph.Graph, key, newName string) (_ *d2graph.Graph, newKey string, err error) {
defer xdefer.Errorf(&err, "failed to rename %#v to %#v", key, newName) defer xdefer.Errorf(&err, "failed to rename %#v to %#v", key, newName)
mk, err := d2parser.ParseMapKey(key) mk, err := d2parser.ParseMapKey(key)
if err != nil { if err != nil {
return nil, err return nil, "", err
} }
if len(mk.Edges) > 0 && mk.EdgeKey == nil { if len(mk.Edges) > 0 && mk.EdgeKey == nil {
@ -1322,7 +1322,7 @@ func Rename(g *d2graph.Graph, key, newName string) (_ *d2graph.Graph, err error)
// Maybe we remove Rename and just have Move. // Maybe we remove Rename and just have Move.
mk2, err := d2parser.ParseMapKey(newName) mk2, err := d2parser.ParseMapKey(newName)
if err != nil { if err != nil {
return nil, err return nil, "", err
} }
mk2.Key = mk.Key mk2.Key = mk.Key
@ -1330,13 +1330,25 @@ func Rename(g *d2graph.Graph, key, newName string) (_ *d2graph.Graph, err error)
} else { } else {
_, ok := d2graph.ReservedKeywords[newName] _, ok := d2graph.ReservedKeywords[newName]
if ok { if ok {
return nil, fmt.Errorf("cannot rename to reserved keyword: %#v", newName) return nil, "", fmt.Errorf("cannot rename to reserved keyword: %#v", newName)
}
if mk.Key != nil {
obj, ok := g.Root.HasChild(d2graph.Key(mk.Key))
if !ok {
return nil, "", fmt.Errorf("key does not exist")
}
// If attempt to name something "x", but "x" already exists, rename it "x 2" instead
generatedName, _, err := generateUniqueKey(g, newName, obj, nil)
if err == nil {
newName = generatedName
}
} }
// TODO: Handle mk.EdgeKey // TODO: Handle mk.EdgeKey
mk.Key.Path[len(mk.Key.Path)-1] = d2ast.MakeValueBox(d2ast.RawString(newName, true)).StringBox() mk.Key.Path[len(mk.Key.Path)-1] = d2ast.MakeValueBox(d2ast.RawString(newName, true)).StringBox()
} }
return move(g, key, d2format.Format(mk), false) g, err = move(g, key, d2format.Format(mk), false)
return g, newName, err
} }
func trimReservedSuffix(path []*d2ast.StringBox) []*d2ast.StringBox { func trimReservedSuffix(path []*d2ast.StringBox) []*d2ast.StringBox {

View file

@ -2193,7 +2193,7 @@ more.(ok.q.z -> p.k): "furbling, v.:"
key: "1.2.3.4", key: "1.2.3.4",
newName: "bic", newName: "bic",
expErr: `failed to rename "1.2.3.4" to "bic": key referenced by from does not exist`, expErr: `failed to rename "1.2.3.4" to "bic": key does not exist`,
}, },
{ {
@ -2215,7 +2215,18 @@ more.(ok.q.z -> p.k): "furbling, v.:"
et := editTest{ et := editTest{
text: tc.text, text: tc.text,
testFunc: func(g *d2graph.Graph) (*d2graph.Graph, error) { testFunc: func(g *d2graph.Graph) (*d2graph.Graph, error) {
return d2oracle.Rename(g, tc.key, tc.newName) objectsBefore := len(g.Objects)
var err error
g, _, err = d2oracle.Rename(g, tc.key, tc.newName)
if err == nil {
objectsAfter := len(g.Objects)
if objectsBefore != objectsAfter {
t.Log(d2format.Format(g.AST))
return nil, fmt.Errorf("rename cannot destroy or create objects: found %d objects before and %d objects after", objectsBefore, objectsAfter)
}
}
return g, err
}, },
exp: tc.exp, exp: tc.exp,

View file

@ -1,4 +1,4 @@
{ {
"graph": null, "graph": null,
"err": "failed to rename \"1.2.3.4\" to \"bic\": key referenced by from does not exist" "err": "failed to rename \"1.2.3.4\" to \"bic\": key does not exist"
} }