package output

import (
	"fmt"
	"strings"
)

var (
	_ fmt.Stringer = KeyValue{}
	_ fmt.Stringer = KeyValues{}
)

type KeyValues []KeyValue

func (kv KeyValues) String() string {
	s := make([]string, len(kv))
	for i, v := range kv {
		s[i] = v.String()
	}

	return strings.Join(s, ", ")
}

type KeyValue struct {
	Key   Key
	Value Value
}

func (k KeyValue) String() string {
	return string(k.Key) + "=\"" + k.Value.String() + "\""
}

func Any(k string, v interface{}) KeyValue {
	return Key(k).Any(v)
}

func Bool(k string, v bool) KeyValue {
	return Key(k).Bool(v)
}

func Int(k string, v int) KeyValue {
	return Key(k).Int(v)
}

func Int64(k string, v int64) KeyValue {
	return Key(k).Int64(v)
}

func Uint(k string, v uint) KeyValue {
	return Key(k).Uint(v)
}

func Uint64(k string, v uint64) KeyValue {
	return Key(k).Uint64(v)
}

func Float64(k string, v float64) KeyValue {
	return Key(k).Float64(v)
}

func String(k string, v string) KeyValue {
	return Key(k).String(v)
}
