package sqlType

import "encoding/json"

type Set map[string]struct{}

func (s Set) MarshalJSON() ([]byte, error) {
	array := make([]string, 0)
	for name := range s {
		array = append(array, name)
	}

	return json.Marshal(array)
}

func (s *Set) UnmarshalJSON(b []byte) error {
	array := make([]string, 0)
	if err := json.Unmarshal(b, &array); err != nil {
		return err
	}

	set := make(map[string]struct{})

	for _, name := range array {
		set[name] = struct{}{}
	}

	*s = set
	return nil
}

func (s Set) ToStringSlice() []string {
	var (
		result = make([]string, 0, len(s))
	)

	for key := range s {
		result = append(result, key)
	}

	return result
}

func (s *Set) FromStringSlice(ss *[]string) {
	if s == nil {
		m := make(Set)
		s = &m
	}

	for idx := range *(ss) {
		(*s)[(*ss)[idx]] = struct{}{}
	}
}