// Code generated by go-enum DO NOT EDIT.
// Version: example
// Revision: example
// Build Date: example
// Built By: example

//go:build example
// +build example

package example

import (
	"database/sql/driver"
	"errors"
	"fmt"
	"strconv"
	"strings"
)

const (
	// Skipped value.
	_ GreekGod = "_"
	// GreekGodZeus is a GreekGod of type zeus.
	GreekGodZeus GreekGod = "zeus"
	// GreekGodApollo is a GreekGod of type apollo.
	GreekGodApollo GreekGod = "apollo"
	// GreekGodAthena is a GreekGod of type athena.
	GreekGodAthena GreekGod = "athena"
	// GreekGodAres is a GreekGod of type ares.
	GreekGodAres GreekGod = "ares"
)

var ErrInvalidGreekGod = fmt.Errorf("not a valid GreekGod, try [%s]", strings.Join(_GreekGodNames, ", "))

var _GreekGodNames = []string{
	string(GreekGodZeus),
	string(GreekGodApollo),
	string(GreekGodAthena),
	string(GreekGodAres),
}

// GreekGodNames returns a list of possible string values of GreekGod.
func GreekGodNames() []string {
	tmp := make([]string, len(_GreekGodNames))
	copy(tmp, _GreekGodNames)
	return tmp
}

// String implements the Stringer interface.
func (x GreekGod) String() string {
	return string(x)
}

// IsValid provides a quick way to determine if the typed value is
// part of the allowed enumerated values
func (x GreekGod) IsValid() bool {
	_, err := ParseGreekGod(string(x))
	return err == nil
}

var _GreekGodValue = map[string]GreekGod{
	"zeus":   GreekGodZeus,
	"apollo": GreekGodApollo,
	"athena": GreekGodAthena,
	"ares":   GreekGodAres,
}

// ParseGreekGod attempts to convert a string to a GreekGod.
func ParseGreekGod(name string) (GreekGod, error) {
	if x, ok := _GreekGodValue[name]; ok {
		return x, nil
	}
	return GreekGod(""), fmt.Errorf("%s is %w", name, ErrInvalidGreekGod)
}

var errGreekGodNilPtr = errors.New("value pointer is nil") // one per type for package clashes

var sqlIntGreekGodMap = map[int64]GreekGod{
	1:  GreekGodZeus,
	2:  GreekGodApollo,
	20: GreekGodAthena,
	21: GreekGodAres,
}

var sqlIntGreekGodValue = map[GreekGod]int64{
	GreekGodZeus:   1,
	GreekGodApollo: 2,
	GreekGodAthena: 20,
	GreekGodAres:   21,
}

func lookupSqlIntGreekGod(val int64) (GreekGod, error) {
	x, ok := sqlIntGreekGodMap[val]
	if !ok {
		return x, fmt.Errorf("%v is not %w", val, ErrInvalidGreekGod)
	}
	return x, nil
}

// Scan implements the Scanner interface.
func (x *GreekGod) Scan(value interface{}) (err error) {
	if value == nil {
		*x = GreekGod("")
		return
	}

	// A wider range of scannable types.
	// driver.Value values at the top of the list for expediency
	switch v := value.(type) {
	case int64:
		*x, err = lookupSqlIntGreekGod(v)
	case string:
		*x, err = ParseGreekGod(v)
	case []byte:
		if val, verr := strconv.ParseInt(string(v), 10, 64); verr == nil {
			*x, err = lookupSqlIntGreekGod(val)
		} else {
			// try parsing the value as a string
			*x, err = ParseGreekGod(string(v))
		}
	case GreekGod:
		*x = v
	case int:
		*x, err = lookupSqlIntGreekGod(int64(v))
	case *GreekGod:
		if v == nil {
			return errGreekGodNilPtr
		}
		*x = *v
	case uint:
		*x, err = lookupSqlIntGreekGod(int64(v))
	case uint64:
		*x, err = lookupSqlIntGreekGod(int64(v))
	case *int:
		if v == nil {
			return errGreekGodNilPtr
		}
		*x, err = lookupSqlIntGreekGod(int64(*v))
	case *int64:
		if v == nil {
			return errGreekGodNilPtr
		}
		*x, err = lookupSqlIntGreekGod(int64(*v))
	case float64: // json marshals everything as a float64 if it's a number
		*x, err = lookupSqlIntGreekGod(int64(v))
	case *float64: // json marshals everything as a float64 if it's a number
		if v == nil {
			return errGreekGodNilPtr
		}
		*x, err = lookupSqlIntGreekGod(int64(*v))
	case *uint:
		if v == nil {
			return errGreekGodNilPtr
		}
		*x, err = lookupSqlIntGreekGod(int64(*v))
	case *uint64:
		if v == nil {
			return errGreekGodNilPtr
		}
		*x, err = lookupSqlIntGreekGod(int64(*v))
	case *string:
		if v == nil {
			return errGreekGodNilPtr
		}
		*x, err = ParseGreekGod(*v)
	default:
		return errors.New("invalid type for GreekGod")
	}

	return
}

// Value implements the driver Valuer interface.
func (x GreekGod) Value() (driver.Value, error) {
	val, ok := sqlIntGreekGodValue[x]
	if !ok {
		return nil, ErrInvalidGreekGod
	}
	return int64(val), nil
}

type NullGreekGod struct {
	GreekGod GreekGod
	Valid    bool
}

func NewNullGreekGod(val interface{}) (x NullGreekGod) {
	err := x.Scan(val) // yes, we ignore this error, it will just be an invalid value.
	_ = err            // make any errcheck linters happy
	return
}

// Scan implements the Scanner interface.
func (x *NullGreekGod) Scan(value interface{}) (err error) {
	if value == nil {
		x.GreekGod, x.Valid = GreekGod(""), false
		return
	}

	err = x.GreekGod.Scan(value)
	x.Valid = (err == nil)
	return
}

// Value implements the driver Valuer interface.
func (x NullGreekGod) Value() (driver.Value, error) {
	if !x.Valid {
		return nil, nil
	}
	// driver.Value accepts int64 for int values.
	return string(x.GreekGod), nil
}

const (
	// Skipped value.
	_ GreekGodCustom = "_"
	// GreekGodCustomZeus is a GreekGodCustom of type zeus.
	GreekGodCustomZeus GreekGodCustom = "zeus"
	// GreekGodCustomApollo is a GreekGodCustom of type apollo.
	GreekGodCustomApollo GreekGodCustom = "apollo"
	// Skipped value.
	_ GreekGodCustom = "_"
	// GreekGodCustomAthena is a GreekGodCustom of type athena.
	GreekGodCustomAthena GreekGodCustom = "20"
	// GreekGodCustomAres is a GreekGodCustom of type ares.
	GreekGodCustomAres GreekGodCustom = "ares"
)

var ErrInvalidGreekGodCustom = fmt.Errorf("not a valid GreekGodCustom, try [%s]", strings.Join(_GreekGodCustomNames, ", "))

var _GreekGodCustomNames = []string{
	string(GreekGodCustomZeus),
	string(GreekGodCustomApollo),
	string(GreekGodCustomAthena),
	string(GreekGodCustomAres),
}

// GreekGodCustomNames returns a list of possible string values of GreekGodCustom.
func GreekGodCustomNames() []string {
	tmp := make([]string, len(_GreekGodCustomNames))
	copy(tmp, _GreekGodCustomNames)
	return tmp
}

// String implements the Stringer interface.
func (x GreekGodCustom) String() string {
	return string(x)
}

// IsValid provides a quick way to determine if the typed value is
// part of the allowed enumerated values
func (x GreekGodCustom) IsValid() bool {
	_, err := ParseGreekGodCustom(string(x))
	return err == nil
}

var _GreekGodCustomValue = map[string]GreekGodCustom{
	"zeus":   GreekGodCustomZeus,
	"apollo": GreekGodCustomApollo,
	"20":     GreekGodCustomAthena,
	"ares":   GreekGodCustomAres,
}

// ParseGreekGodCustom attempts to convert a string to a GreekGodCustom.
func ParseGreekGodCustom(name string) (GreekGodCustom, error) {
	if x, ok := _GreekGodCustomValue[name]; ok {
		return x, nil
	}
	return GreekGodCustom(""), fmt.Errorf("%s is %w", name, ErrInvalidGreekGodCustom)
}

var errGreekGodCustomNilPtr = errors.New("value pointer is nil") // one per type for package clashes

var sqlIntGreekGodCustomMap = map[int64]GreekGodCustom{
	1:  GreekGodCustomZeus,
	2:  GreekGodCustomApollo,
	20: GreekGodCustomAthena,
	21: GreekGodCustomAres,
}

var sqlIntGreekGodCustomValue = map[GreekGodCustom]int64{
	GreekGodCustomZeus:   1,
	GreekGodCustomApollo: 2,
	GreekGodCustomAthena: 20,
	GreekGodCustomAres:   21,
}

func lookupSqlIntGreekGodCustom(val int64) (GreekGodCustom, error) {
	x, ok := sqlIntGreekGodCustomMap[val]
	if !ok {
		return x, fmt.Errorf("%v is not %w", val, ErrInvalidGreekGodCustom)
	}
	return x, nil
}

// Scan implements the Scanner interface.
func (x *GreekGodCustom) Scan(value interface{}) (err error) {
	if value == nil {
		*x = GreekGodCustom("")
		return
	}

	// A wider range of scannable types.
	// driver.Value values at the top of the list for expediency
	switch v := value.(type) {
	case int64:
		*x, err = lookupSqlIntGreekGodCustom(v)
	case string:
		*x, err = ParseGreekGodCustom(v)
	case []byte:
		if val, verr := strconv.ParseInt(string(v), 10, 64); verr == nil {
			*x, err = lookupSqlIntGreekGodCustom(val)
		} else {
			// try parsing the value as a string
			*x, err = ParseGreekGodCustom(string(v))
		}
	case GreekGodCustom:
		*x = v
	case int:
		*x, err = lookupSqlIntGreekGodCustom(int64(v))
	case *GreekGodCustom:
		if v == nil {
			return errGreekGodCustomNilPtr
		}
		*x = *v
	case uint:
		*x, err = lookupSqlIntGreekGodCustom(int64(v))
	case uint64:
		*x, err = lookupSqlIntGreekGodCustom(int64(v))
	case *int:
		if v == nil {
			return errGreekGodCustomNilPtr
		}
		*x, err = lookupSqlIntGreekGodCustom(int64(*v))
	case *int64:
		if v == nil {
			return errGreekGodCustomNilPtr
		}
		*x, err = lookupSqlIntGreekGodCustom(int64(*v))
	case float64: // json marshals everything as a float64 if it's a number
		*x, err = lookupSqlIntGreekGodCustom(int64(v))
	case *float64: // json marshals everything as a float64 if it's a number
		if v == nil {
			return errGreekGodCustomNilPtr
		}
		*x, err = lookupSqlIntGreekGodCustom(int64(*v))
	case *uint:
		if v == nil {
			return errGreekGodCustomNilPtr
		}
		*x, err = lookupSqlIntGreekGodCustom(int64(*v))
	case *uint64:
		if v == nil {
			return errGreekGodCustomNilPtr
		}
		*x, err = lookupSqlIntGreekGodCustom(int64(*v))
	case *string:
		if v == nil {
			return errGreekGodCustomNilPtr
		}
		*x, err = ParseGreekGodCustom(*v)
	default:
		return errors.New("invalid type for GreekGodCustom")
	}

	return
}

// Value implements the driver Valuer interface.
func (x GreekGodCustom) Value() (driver.Value, error) {
	val, ok := sqlIntGreekGodCustomValue[x]
	if !ok {
		return nil, ErrInvalidGreekGodCustom
	}
	return int64(val), nil
}

type NullGreekGodCustom struct {
	GreekGodCustom GreekGodCustom
	Valid          bool
}

func NewNullGreekGodCustom(val interface{}) (x NullGreekGodCustom) {
	err := x.Scan(val) // yes, we ignore this error, it will just be an invalid value.
	_ = err            // make any errcheck linters happy
	return
}

// Scan implements the Scanner interface.
func (x *NullGreekGodCustom) Scan(value interface{}) (err error) {
	if value == nil {
		x.GreekGodCustom, x.Valid = GreekGodCustom(""), false
		return
	}

	err = x.GreekGodCustom.Scan(value)
	x.Valid = (err == nil)
	return
}

// Value implements the driver Valuer interface.
func (x NullGreekGodCustom) Value() (driver.Value, error) {
	if !x.Valid {
		return nil, nil
	}
	// driver.Value accepts int64 for int values.
	return string(x.GreekGodCustom), nil
}
