package parser import ( "complie-erlang/cache" "complie-erlang/parser/zm_lib" "fmt" "os" "path/filepath" "regexp" ) type ErrCode struct { codeMap map[string]bool ClientConfig *ClientConfig } func NewErrCode(c *ClientConfig) *ErrCode { return &ErrCode{ codeMap: make(map[string]bool), ClientConfig: c, } } func (e *ErrCode) LoadWd() error { wdDir, err := zm_lib.FindPathByWd(".") if err != nil { return err } return e.iterationDir(wdDir) } func (e *ErrCode) iterationDir(baseDir string) error { dir, err := os.ReadDir(baseDir) if err != nil { return err } for _, d := range dir { if d.IsDir() { err = e.iterationDir(filepath.Join(filepath.Join(baseDir, d.Name()))) if err != nil { return err } continue } path := filepath.Join(baseDir, d.Name()) if err = e.loadFile(path); err != nil { return err } } return nil } func (e *ErrCode) loadFile(filename string) error { bytes, err := os.ReadFile(filename) if err != nil { return err } // 定义正则表达式 // 注意:由于\?在Go的字符串中是一个特殊字符,我们使用\\?来表示一个问号。 // 同时,由于双引号在正则表达式中有特殊含义,我们需要使用\\"来表示一个普通双引号。 // 我们使用非贪婪匹配来确保只匹配到第一个双引号后的内容。 re := regexp.MustCompile(`(?:\\?\?ThrowErr|throw)\("([^"]+)"\)`) // 查找所有匹配项 matches := re.FindAllStringSubmatch(string(bytes), -1) // 提取并打印双引号内的内容 for _, match := range matches { // match[0] 是整个匹配的字符串,match[1] 是第一个括号内的匹配(即双引号内的内容) if e.codeMap[match[1]] { continue } e.codeMap[match[1]] = true } return nil } func (e *ErrCode) PrintErrCode(c cache.Cache) error { fmt.Println(">") for key := range e.codeMap { line := e.ClientConfig.LineByKey(key) if line == nil { val, is := c.Get(key) if is { fmt.Printf(" %s: %v[cache] \n", key, val) } else { fmt.Printf(" %s: %v \n", key, nil) } } else { _, s, err := e.ClientConfig.ValueByLine(line, "UserCN") if err != nil { return err } fmt.Printf(" %s: %s \n", key, s) } } fmt.Println() return nil }