// SPDX-License-Identifier: MIT

package persist

import (
	"encoding/json"
	"os"

	"github.com/pkg/errors"
)

// Save saves a representation of v to the file at path.
func Save(f *os.File, v interface{}) error {
	data, err := json.MarshalIndent(v, "", "\t")
	if err != nil {
		return errors.Wrapf(err, "error marshaling value of type %T", v)
	}

	_, err = f.Seek(0, 0)
	if err != nil {
		return errors.Wrap(err, "error seeking to beginning of file")
	}

	err = f.Truncate(0)
	if err != nil {
		return errors.Wrap(err, "error truncating file")
	}

	_, err = f.Write(data)
	if err != nil {
		return errors.Wrap(err, "error copying data into file")
	}

	_, err = f.Seek(0, 0)
	return errors.Wrap(err, "error seeking to beginning of file")
}

// Load loads the file at path into v.
// Use os.IsNotExist() to see if the returned error is due
// to the file being missing.
func Load(f *os.File, v interface{}) error {
	_, err := f.Seek(0, 0)
	if err != nil {
		return errors.Wrap(err, "error reetting reader")
	}
	err = json.NewDecoder(f).Decode(v)
	return errors.Wrap(err, "error decoding value")
}