// 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")
}
