| // Copyright 2022 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package protocol |
| |
| import ( |
| "encoding/json" |
| "fmt" |
| ) |
| |
| // DocumentChanges is a union of a file edit and directory rename operations |
| // for package renaming feature. At most one field of this struct is non-nil. |
| type DocumentChanges struct { |
| TextDocumentEdit *TextDocumentEdit |
| RenameFile *RenameFile |
| } |
| |
| func (d *DocumentChanges) UnmarshalJSON(data []byte) error { |
| var m map[string]interface{} |
| |
| if err := json.Unmarshal(data, &m); err != nil { |
| return err |
| } |
| |
| if _, ok := m["textDocument"]; ok { |
| d.TextDocumentEdit = new(TextDocumentEdit) |
| return json.Unmarshal(data, d.TextDocumentEdit) |
| } |
| |
| d.RenameFile = new(RenameFile) |
| return json.Unmarshal(data, d.RenameFile) |
| } |
| |
| func (d *DocumentChanges) MarshalJSON() ([]byte, error) { |
| if d.TextDocumentEdit != nil { |
| return json.Marshal(d.TextDocumentEdit) |
| } else if d.RenameFile != nil { |
| return json.Marshal(d.RenameFile) |
| } |
| return nil, fmt.Errorf("Empty DocumentChanges union value") |
| } |