package pointer

import (
	"encoding/json"
	"fmt"

	"github.com/jinzhu/copier"
)

func Pointer[T any](v T) *T {
	return &v
}

func Deref[T any](v *T, def T) T {
	if v == nil {
		return def
	}
	return *v
}

func DerefAny[T any](v any, def T) T {
	t, ok := v.(T)
	if !ok {
		return def
	}
	return t
}

func DeepCopy[T any](v *T) (*T, error) {
	if v == nil {
		return nil, fmt.Errorf("nil pointer")
	}

	var n T
	err := copier.CopyWithOption(&n, v, copier.Option{DeepCopy: true})
	if err != nil {
		return nil, err
	}
	return &n, nil
}

func MarshalWithoutError[T any](v T) []byte {
	data, err := json.Marshal(v)
	if err != nil {
		return []byte(err.Error())
	}

	return data
}
