| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | package svcimport (	"fmt"	"time"	"golib/v3/features/mo"	"golib/v3/infra/ii")// Row 是一个通过 ii.ItemInfo 校验后的 Map. 通常在成功调用 InsertOne 或 InsertMany 时表示已通过校验// 目前可以通过 Find 或 Unmarshal 来获取或创建 Row 类型的数据type Row struct {	itemInfo *ii.ItemInfo	m        mo.M}func (c Row) Raw() mo.M {	return c.m}func (c Row) Any(k string) any {	return c.m[k]}func (c Row) Double(k string) float64 {	v, _ := c.m[k].(float64)	return v}func (c Row) Strings(k string) string {	v, _ := c.m[k].(string)	return v}func (c Row) Object(k string) mo.M {	v, _ := c.m[k].(mo.M)	return v	// m, err := c.itemInfo.ConvertObject(c.Raw, k)	// if err != nil {	// 	return nil, err	// }	// fieldInfo, _ := c.itemInfo.Field(k)	// subItem := *c.itemInfo	// subItem.Fields = fieldInfo.Fields	// return &Row{itemInfo: &subItem, Raw: m}, nil}func (c Row) ObjectTo(k string, val any) error {	v, ok := c.m[k].(mo.M)	if !ok {		return fmt.Errorf("field %v not found in Row", k)	}	return mo.Decode(v, val)}func (c Row) Array(k string) mo.A {	v, _ := c.m[k].(mo.A)	return v}func (c Row) Binary(k string) mo.Binary {	v, _ := c.m[k].(mo.Binary)	return v}func (c Row) ObjectID(k string) mo.ObjectID {	v, ok := c.m[k].(mo.ObjectID)	if !ok {		return mo.NilObjectID	}	return v}func (c Row) Boolean(k string) bool {	v, _ := c.m[k].(bool)	return v}func (c Row) Date(k string) mo.DateTime {	v, _ := c.m[k].(mo.DateTime)	return v}func (c Row) Int32(k string) int32 {	v, _ := c.m[k].(int32)	return v}func (c Row) Int64(k string) int64 {	v, _ := c.m[k].(int64)	return v}func (c Row) Has(k string) bool {	v, ok := c.m[k]	if !ok {		return false	}	return v != nil}func (c Row) HasKey(k string) bool {	_, ok := c.m[k]	return ok}func (c Row) Delete(k string) {	delete(c.m, k)}func (c Row) Range(f func(k string, v any) bool) {	for k, v := range c.m {		if !f(k, v) {			return		}	}}func (c Row) Set(k string, v any) error {	if field, ok := c.itemInfo.Field(k); ok {		if val, err := field.Convert(v); err == nil {			c.m[k] = val			return nil		} else {			return err		}	} else {		return fmt.Errorf(k + " not found")	}}func (c Row) Get(k string) (any, bool) {	v, ok := c.m[k]	return v, ok}func (c Row) LastModified() time.Time {	if last := c.Date(ii.LastModified); last > 0 {		return last.Time().Local()	}	if creat := c.Date(ii.CreationTime); creat > 0 {		return creat.Time().Local()	}	return time.Time{}}func (c Row) String() string {	b, err := mo.MarshalExtJSON(c.m, true, true)	if err != nil {		return err.Error()	}	return string(b)}func (c Row) MarshalText() (text []byte, err error) {	return mo.MarshalExtJSON(c.m, false, true)}func (c Row) MarshalJSON() ([]byte, error) {	return mo.MarshalExtJSON(c.m, false, true)}
 |