| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | 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)	for i, field := range c.Fields {		if !isEnabledType(field.Type) {			return fmt.Errorf("%s: unenabled type: %s", c.Name, field.Type.String())		}		for _, l := range field.Lookup {			if l.ForeignField == "" || l.From == "" || l.AS == "" {				return fmt.Errorf("%s: %s.Lookup: config error", c.Name, field.Name)			}			if l.AS == field.Name {				return fmt.Errorf("%s: duplicate names are not allowed: Field.Name: %s, Lookup.AS: %s", c.Name, field.Name, l.AS)			}		}		for _, s := range field.Set {			if s.Name == "" || s.OP == "" || s.Value == "" {				return fmt.Errorf("%s: %s.Set: config error", c.Name, field.Name)			}		}		c.FieldMap[field.Name] = i	}	return nil}// initEnums 初始化枚举类型值func (c *ItemInfo) initEnums() error {	for i, field := range c.Fields {		length := len(field.Enums)		enum := make([]any, length)		for j := 0; j < length; j++ {			val, err := field.Convert(field.Enums[j])			if err != nil {				return fmt.Errorf("%s.%s: initEnums: %s", c.Name, field.Name, err)			}			enum[j] = val		}		c.Fields[i].enums = enum	}	return nil}// initValue 初始化默认值类型func (c *ItemInfo) initValue() error {	for i, field := range c.Fields {		// array 和 object 无需解析默认值		if strings.TrimSpace(field.Default) == "" || field.Type == mo.TypeArray || field.Type == mo.TypeObject {			c.Fields[i].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)		}		c.Fields[i].defaultValue = val	}	return nil}func (c *ItemInfo) initPattern() error {	for i, 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)			}			c.Fields[i].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		}	}}
 |