package asaModels import ( "regexp" "strings" ) var ( NAMERE = regexp.MustCompile(`(?i)name[ ]+(\S+)\s+(.*?)\n`) NAMEDESCRE = regexp.MustCompile(`(\S+)\s+description\s+(.*?)$`) ) type ( Names struct { Names bool `json:"names_enabled"` NameList []*Name `json:"name_list"` } Name struct { IPAddress string `json:"ip_address"` Name string `json:"name"` Desc *string `json:"description"` } ) func (n *Names) Parse(s string) { n.Names = true if strings.Contains(s, "no names") { n.Names = false } for _, name := range NAMERE.FindAllStringSubmatch(s, -1) { desc := NAMEDESCRE.FindStringSubmatch(name[2]) if desc != nil { n.NameList = append(n.NameList, &Name{ IPAddress: name[1], Name: desc[1], Desc: &desc[2], }) continue } n.NameList = append(n.NameList, &Name{ IPAddress: name[1], Name: name[2], }) } } func (n *Names) IPName(ip string) *Name { return IPName(ip, n.NameList) } //NameIP returns the IP of the name or the initial value if no match is found. func (n *Names) NameIP(name string) string { if n.Names == false { return name } for _, n := range n.NameList { if n.Name == name { return n.IPAddress } } return name } func IPName(ip string, n []*Name) *Name { for _, n := range n { if n.IPAddress == ip { return n } } return nil } func (n *Names) StrName(name string) *Name { return StrName(name, n.NameList) } func StrName(name string, n []*Name) *Name { for _, n := range n { if n.Name == name { return n } } return nil }