package common

import (
	
	
	
	
	

	
)

type Messages struct {
	messages map[string]bool
}

func ( *Messages) () {
	if .messages == nil {
		.messages = make(map[string]bool)
	}
}

func ( Messages) () bool {
	// TODO replacement for Action.skipCache - does this need to consider suppressed messages or is this fine?
	return len(.messages) == 0
}

func ( *Messages) ( string) {
	.init()
	.messages[] = true
}

func ( Messages) () []string {
	 := make([]string, 0)
	for  := range .messages {
		 = append(, )
	}
	sort.Strings()
	return 
}

func ( *Messages) ( ...string) error {
	.init()

	for ,  := range  {
		,  := regexp.Compile()
		if  != nil {
			return 
		}

		for  := range .messages {
			if .MatchString() {
				delete(.messages, )
			}
		}
	}
	return nil
}

func ( *Messages) ( Messages) {
	if .messages == nil {
		return
	}

	for  := range .messages {
		.Add()
	}
}

func ( Messages) ( RawValues,  string) RawValues {
	.init()

	if len(.messages) == 0 {
		return 
	}

	 := make([]string, 0)
	for  := range .messages {
		 = append(, )
	}
	sort.Strings()

	switch {
	case strings.HasSuffix(, "ERR"):
		 = strings.TrimSuffix(, "ERR")
	case strings.HasSuffix(, "ER"):
		 = strings.TrimSuffix(, "ER")
	case strings.HasSuffix(, "E"):
		 = strings.TrimSuffix(, "E")
	}

	 := 0
	for ,  := range  {
		 :=  + "ERR"
		 := "ERR"
		for {
			if  > 0 {
				 = fmt.Sprintf("%vERR%v", , )
				 = fmt.Sprintf("ERR%v", )
			}
			 += 1

			if !.contains() {
				break
			}
		}

		 = append(, RawValue{
			Value:       ,
			Display:     ,
			Description: ,
			Style:       style.Carapace.Error,
		})
	}

	if len() == 1 {
		 = append(, RawValue{
			Value:        + "_",
			Display:     "_",
			Description: "",
			Style:       style.Default,
		})
	}
	sort.Sort(ByDisplay())
	return 
}

func ( Messages) () ([]byte, error) {
	var  []string = make([]string, 0, len(.messages))
	for  := range .messages {
		 = append(, )
	}
	sort.Strings()
	return json.Marshal(&)
}

func ( *Messages) ( []byte) ( error) {
	var  []string
	if  = json.Unmarshal(, &);  != nil {
		return 
	}
	for ,  := range  {
		.Add()
	}
	return
}