package zm_proto import ( "fmt" "os" "regexp" "strings" ) type Port struct { Cmd string // 地址 PortDesc string // 描述 ClientPB string // ServerPB string ConnectType string IsPush bool Parallel bool Proto *Proto } func ParsePort(Proto *Proto, path string) ([]Port, error) { bytes, err := os.ReadFile(path) if err != nil { return nil, err } mustPort := regexp.MustCompile(`/\*/*Cmd=.+\*/`) result := mustPort.FindAllStringSubmatch(string(bytes), -1) //fmt.Println("result", result) var ports []Port for _, res := range result { for _, match := range res { match = match[2 : len(match)-2] // fmt.Println("match", match) var p = Port{Proto: Proto} for _, fieldStr := range strings.Split(match, ";") { fieldslice := strings.Split(fieldStr, "=") if len(fieldslice) != 2 { return nil, fmt.Errorf("invalid field: %s, match: %s", fieldStr, match) } switch fieldslice[0] { case "Cmd": p.Cmd = fieldslice[1] case "PortDesc": p.PortDesc = fieldslice[1] case "ClientPB": p.ClientPB = fieldslice[1] case "ServerPB": p.ServerPB = fieldslice[1] case "ConnectType": p.ConnectType = fieldslice[1] case "IsPush": p.IsPush = fieldslice[1] == "true" case "Parallel": p.Parallel = fieldslice[1] == "true" } } ports = append(ports, p) } } return ports, nil }