// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package keys

import (
	"golang.org/x/exp/event"
)

// Value represents a key for untyped values.
type Value string

// From can be used to get a value from a Label.
func (k Value) From(l event.Label) interface{} { return l.Interface() }

// Of creates a new Label with this key and the supplied value.
func (k Value) Of(v interface{}) event.Label {
	return event.Value(string(k), v)
}

// Tag represents a key for tagging labels that have no value.
// These are used when the existence of the label is the entire information it
// carries, such as marking events to be of a specific kind, or from a specific
// package.
type Tag string

// New creates a new Label with this key.
func (k Tag) New() event.Label {
	return event.Label{Name: string(k)}
}

// Int represents a key
type Int string

// Of creates a new Label with this key and the supplied value.
func (k Int) Of(v int) event.Label {
	return event.Int64(string(k), int64(v))
}

// From can be used to get a value from a Label.
func (k Int) From(l event.Label) int { return int(l.Int64()) }

// Int8 represents a key
type Int8 string

// Of creates a new Label with this key and the supplied value.
func (k Int8) Of(v int8) event.Label {
	return event.Int64(string(k), int64(v))
}

// From can be used to get a value from a Label.
func (k Int8) From(l event.Label) int8 { return int8(l.Int64()) }

// Int16 represents a key
type Int16 string

// Of creates a new Label with this key and the supplied value.
func (k Int16) Of(v int16) event.Label {
	return event.Int64(string(k), int64(v))
}

// From can be used to get a value from a Label.
func (k Int16) From(l event.Label) int16 { return int16(l.Int64()) }

// Int32 represents a key
type Int32 string

// Of creates a new Label with this key and the supplied value.
func (k Int32) Of(v int32) event.Label {
	return event.Int64(string(k), int64(v))
}

// From can be used to get a value from a Label.
func (k Int32) From(l event.Label) int32 { return int32(l.Int64()) }

// Int64 represents a key
type Int64 string

// Of creates a new Label with this key and the supplied value.
func (k Int64) Of(v int64) event.Label {
	return event.Int64(string(k), v)
}

// From can be used to get a value from a Label.
func (k Int64) From(l event.Label) int64 { return l.Int64() }

// UInt represents a key
type UInt string

// Of creates a new Label with this key and the supplied value.
func (k UInt) Of(v uint) event.Label {
	return event.Uint64(string(k), uint64(v))
}

// From can be used to get a value from a Label.
func (k UInt) From(l event.Label) uint { return uint(l.Uint64()) }

// UInt8 represents a key
type UInt8 string

// Of creates a new Label with this key and the supplied value.
func (k UInt8) Of(v uint8) event.Label {
	return event.Uint64(string(k), uint64(v))
}

// From can be used to get a value from a Label.
func (k UInt8) From(l event.Label) uint8 { return uint8(l.Uint64()) }

// UInt16 represents a key
type UInt16 string

// Of creates a new Label with this key and the supplied value.
func (k UInt16) Of(v uint16) event.Label {
	return event.Uint64(string(k), uint64(v))
}

// From can be used to get a value from a Label.
func (k UInt16) From(l event.Label) uint16 { return uint16(l.Uint64()) }

// UInt32 represents a key
type UInt32 string

// Of creates a new Label with this key and the supplied value.
func (k UInt32) Of(v uint32) event.Label {
	return event.Uint64(string(k), uint64(v))
}

// From can be used to get a value from a Label.
func (k UInt32) From(l event.Label) uint32 { return uint32(l.Uint64()) }

// UInt64 represents a key
type UInt64 string

// Of creates a new Label with this key and the supplied value.
func (k UInt64) Of(v uint64) event.Label {
	return event.Uint64(string(k), v)
}

// From can be used to get a value from a Label.
func (k UInt64) From(l event.Label) uint64 { return l.Uint64() }

// Float32 represents a key
type Float32 string

// Of creates a new Label with this key and the supplied value.
func (k Float32) Of(v float32) event.Label {
	return event.Float64(string(k), float64(v))
}

// From can be used to get a value from a Label.
func (k Float32) From(l event.Label) float32 { return float32(l.Float64()) }

// Float64 represents a key
type Float64 string

// Of creates a new Label with this key and the supplied value.
func (k Float64) Of(v float64) event.Label {
	return event.Float64(string(k), v)
}

// From can be used to get a value from a Label.
func (k Float64) From(l event.Label) float64 {
	return l.Float64()
}

// String represents a key
type String string

// Of creates a new Label with this key and the supplied value.
func (k String) Of(v string) event.Label {
	return event.String(string(k), v)
}

// From can be used to get a value from a Label.
func (k String) From(l event.Label) string { return l.String() }

// Bool represents a key
type Bool string

// Of creates a new Label with this key and the supplied value.
func (k Bool) Of(v bool) event.Label {
	return event.Bool(string(k), v)
}

// From can be used to get a value from a Label.
func (k Bool) From(l event.Label) bool { return l.Bool() }
