| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | package svcimport (	"errors"	"fmt"	"reflect"	"strings"		"golib/v4/features/mo"	"golib/v4/infra/ii")func (s *Service) resolveInsert(value any) (mo.D, error) {	switch val := value.(type) {	case mo.D:		return val, nil	case mo.M:		var doc mo.D		return doc, mo.Decode(val, &doc)	case Row:		return val.D, nil	default:		var doc mo.D		if err := mo.DecodeJson(val, &doc); err != nil {			return nil, err		}		return doc, nil	}}func (s *Service) toDocs(value any, f func(doc mo.D) (mo.D, error)) (mo.A, error) {	dv := reflect.ValueOf(value)	if dv.Kind() != reflect.Slice {		return nil, ErrDataTypeError	}	if dv.Len() == 0 {		return nil, ErrDataError	}	docs := make(mo.A, dv.Len())	for i := 0; i < dv.Len(); i++ {		params, err := s.resolveInsert(dv.Index(i).Interface())		if err != nil {			return nil, err		}		doc, err := f(params)		if err != nil {			s.Log.Error("svc.toDocs: the %d element handled: %s", i, err)			return nil, err		}		docs[i] = doc	}	return docs, nil}func (s *Service) checkBindType(v any) error {	if reflect.TypeOf(v).Kind() != reflect.Ptr {		return ErrBindTypeError	}	return nil}func splitPATH(path, prefix string) (string, ii.Name, error) {	// "","item","insertOne","test.user"	pathList := strings.Split(path, "/")	if len(pathList) != 4 {		return "", "", fmt.Errorf("err path: %s", path)	}	if pathList[1] != prefix {		return "", "", errors.New("the first element of PATH must be: item")	}	return pathList[2], ii.Name(pathList[3]), nil}func Decode(row Row, v any) error {	return mo.Decode(row.Clone(), v)}func DecodeAll[T any](rows []Row, dst *[]T) error {	if len(*dst) < len(rows) {		*dst = make([]T, len(rows))	}	for i, row := range rows {		var v T		if err := Decode(row, &v); err != nil {			return err		}		(*dst)[i] = v	}	return nil}func Unmarshal(b []byte) (Row, error) {	var raw mo.D	if err := mo.UnmarshalExtJSON(b, true, &raw); err != nil {		return Row{}, err	}	return Row{D: raw}, nil}
 |