package ezdb

import "encoding/json"

// JSONMarshaler is a DocumentMarshaler that converts documents to JSON data.
type JSONMarshaler[T any] struct {
	factory func() T
}

func (m *JSONMarshaler[T]) Factory() T {
	return m.factory()
}

func (m *JSONMarshaler[T]) Marshal(src T) ([]byte, error) {
	return json.Marshal(src)
}

func (m *JSONMarshaler[T]) Unmarshal(src []byte, dest T) error {
	return json.Unmarshal(src, dest)
}

// JSON creates a DocumentMarshaler that converts documents to JSON data.
func JSON[T any](factory func() T) *JSONMarshaler[T] {
	return &JSONMarshaler[T]{factory: factory}
}