package mo

import (
	"go.mongodb.org/mongo-driver/bson"
)

type convert struct{}

func (c convert) M(d D) M {
	m, _ := c.ME(d)
	return m
}

func (c convert) D(m M) D {
	d, _ := c.DE(m)
	return d
}

func (c convert) ME(d D) (M, error) {
	b, err := bson.Marshal(d)
	if err != nil {
		return M{}, err
	}
	var m M
	if err = bson.Unmarshal(b, &m); err != nil {
		return M{}, err
	}
	return m, nil
}

func (c convert) DE(m M) (D, error) {
	b, err := bson.Marshal(m)
	if err != nil {
		return D{}, err
	}
	var d D
	if err = bson.Unmarshal(b, &d); err != nil {
		return D{}, err
	}
	return d, nil
}

var (
	// Convert 将 D 转换为 M, 或将 M 转换为 D
	// MongoDB Go Driver 2.0 不支持直接从 D 转换为 M. 所以, 用户应该使用 bson.Marshal 将 D 编组为 BSON, 并使用 bson.Unmarshal 将其解编为 M.
	Convert = convert{}
)
