| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | package iiimport (	"fmt"	"regexp"	"strings"	"golib/features/mo")func (c *ItemInfo) init() error {	if err := c.initEnums(); err != nil {		return err	}	if err := c.initValue(); err != nil {		return err	}	if err := c.initPattern(); err != nil {		return err	}	c.initMap()	return c.initFieldMap()}// initFieldMap 创建字段索引func (c *ItemInfo) initFieldMap() error {	c.fieldMap = make(map[string]int)	c.lookupMap = make(map[string]mo.D)	for i, field := range c.Fields {		if !isEnabledType(field.Type) {			return fmt.Errorf("unenabled type: %s", field.Type.String())		}		c.initLookup(field)		c.fieldMap[field.Name] = i	}	// TODO 为每个 XML 移除 _id 字段 (考虑全局查询)	// if _, ok := c.fieldMap[mo.ID.Key()]; !ok {	// 	return fmt.Errorf("%s: initFieldMap: _id key not found", c.Name)	// }	return nil}// initEnums 初始化枚举类型值func (c *ItemInfo) initEnums() error {	for _, field := range c.Fields {		length := len(field.Enums)		enum := make([]any, length)		for i := 0; i < length; i++ {			val, err := field.Convert(field.Enums[i])			if err != nil {				return fmt.Errorf("%s.%s: initEnums: %s", c.Name, field.Name, err)			}			enum[i] = val		}		field.enums = enum	}	return nil}// initValue 初始化默认值类型func (c *ItemInfo) initValue() error {	for _, field := range c.Fields {		// array 和 object 无需解析默认值		if strings.TrimSpace(field.Default) == "" || field.Type == mo.TypeArray || field.Type == mo.TypeObject {			field.defaultValue = field.Type.Default()			continue		}		val, err := field.Convert(field.Default)		if err != nil {			return fmt.Errorf("%s.%s: initValue: %s", c.Name, field.Name, err)		}		field.defaultValue = val	}	return nil}func (c *ItemInfo) initPattern() error {	for _, field := range c.Fields {		if field.Pattern != "" {			regex, err := regexp.Compile(field.Pattern)			if err != nil {				return fmt.Errorf("%s.%s: initPattern: %s", c.Name, field.Name, err)			}			field.pattern = regex		}	}	return nil}// initMap 初始化必填和唯一func (c *ItemInfo) initMap() {	c.requiredMap = make(map[string]int)	c.uniqueMap = make(map[string]int)	for idx, field := range c.Fields {		if field.Required {			c.requiredMap[field.Name] = idx		}		if field.Unique {			c.uniqueMap[field.Name] = idx		}	}}func (c *ItemInfo) initLookup(field FieldInfo) {	if field.Lookup.ForeignField != "" && field.Lookup.Form != "" && field.Lookup.AS != "" {		l := new(mo.Looker)		l.From(field.Lookup.Form)		l.LocalField(field.Name)		l.ForeignField(field.Lookup.ForeignField)		l.As(field.Lookup.AS)		pipe := mo.Pipeline{}		if !field.Lookup.List {			pipe = append(pipe, mo.NewLimiter(1))		}		if len(field.Fields) > 0 {			p := mo.Projecter{}			for _, f := range field.Fields {				p.Add(f.Name, 1)			}			pipe = append(pipe, p.Pipeline())		}		l.Pipe(pipe)		c.lookupMap[field.Name] = l.Pipeline()	}}
 |