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

package fields

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

const (
	// PostStatusDraft is a PostStatus of type Draft.
	PostStatusDraft PostStatus = iota
	// PostStatusPublished is a PostStatus of type Published.
	PostStatusPublished
)

var ErrInvalidPostStatus = fmt.Errorf("not a valid PostStatus, try [%s]", strings.Join(_PostStatusNames, ", "))

const _PostStatusName = "draftpublished"

var _PostStatusNames = []string{
	_PostStatusName[0:5],
	_PostStatusName[5:14],
}

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

// PostStatusValues returns a list of the values for PostStatus
func PostStatusValues() []PostStatus {
	return []PostStatus{
		PostStatusDraft,
		PostStatusPublished,
	}
}

var _PostStatusMap = map[PostStatus]string{
	PostStatusDraft:     _PostStatusName[0:5],
	PostStatusPublished: _PostStatusName[5:14],
}

// String implements the Stringer interface.
func (x PostStatus) String() string {
	if str, ok := _PostStatusMap[x]; ok {
		return str
	}
	return fmt.Sprintf("PostStatus(%d)", x)
}

// IsValid provides a quick way to determine if the typed value is
// part of the allowed enumerated values
func (x PostStatus) IsValid() bool {
	_, ok := _PostStatusMap[x]
	return ok
}

var _PostStatusValue = map[string]PostStatus{
	_PostStatusName[0:5]:  PostStatusDraft,
	_PostStatusName[5:14]: PostStatusPublished,
}

// ParsePostStatus attempts to convert a string to a PostStatus.
func ParsePostStatus(name string) (PostStatus, error) {
	if x, ok := _PostStatusValue[name]; ok {
		return x, nil
	}
	return PostStatus(0), fmt.Errorf("%s is %w", name, ErrInvalidPostStatus)
}

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

// Scan implements the Scanner interface.
func (x *PostStatus) Scan(value interface{}) (err error) {
	if value == nil {
		*x = PostStatus(0)
		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 = PostStatus(v)
	case string:
		*x, err = ParsePostStatus(v)
		if err != nil {
			// try parsing the integer value as a string
			if val, verr := strconv.Atoi(v); verr == nil {
				*x, err = PostStatus(val), nil
			}
		}
	case []byte:
		*x, err = ParsePostStatus(string(v))
		if err != nil {
			// try parsing the integer value as a string
			if val, verr := strconv.Atoi(string(v)); verr == nil {
				*x, err = PostStatus(val), nil
			}
		}
	case PostStatus:
		*x = v
	case int:
		*x = PostStatus(v)
	case *PostStatus:
		if v == nil {
			return errPostStatusNilPtr
		}
		*x = *v
	case uint:
		*x = PostStatus(v)
	case uint64:
		*x = PostStatus(v)
	case *int:
		if v == nil {
			return errPostStatusNilPtr
		}
		*x = PostStatus(*v)
	case *int64:
		if v == nil {
			return errPostStatusNilPtr
		}
		*x = PostStatus(*v)
	case float64: // json marshals everything as a float64 if it's a number
		*x = PostStatus(v)
	case *float64: // json marshals everything as a float64 if it's a number
		if v == nil {
			return errPostStatusNilPtr
		}
		*x = PostStatus(*v)
	case *uint:
		if v == nil {
			return errPostStatusNilPtr
		}
		*x = PostStatus(*v)
	case *uint64:
		if v == nil {
			return errPostStatusNilPtr
		}
		*x = PostStatus(*v)
	case *string:
		if v == nil {
			return errPostStatusNilPtr
		}
		*x, err = ParsePostStatus(*v)
		if err != nil {
			// try parsing the integer value as a string
			if val, verr := strconv.Atoi(*v); verr == nil {
				*x, err = PostStatus(val), nil
			}
		}
	}

	return
}

// Value implements the driver Valuer interface.
func (x PostStatus) Value() (driver.Value, error) {
	return int64(x), nil
}

// Set implements the Golang flag.Value interface func.
func (x *PostStatus) Set(val string) error {
	v, err := ParsePostStatus(val)
	*x = v
	return err
}

// Get implements the Golang flag.Getter interface func.
func (x *PostStatus) Get() interface{} {
	return *x
}

// Type implements the github.com/spf13/pFlag Value interface.
func (x *PostStatus) Type() string {
	return "PostStatus"
}

type NullPostStatus struct {
	PostStatus PostStatus
	Valid      bool
}

func NewNullPostStatus(val interface{}) (x NullPostStatus) {
	x.Scan(val) // yes, we ignore this error, it will just be an invalid value.
	return
}

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

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

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

type NullPostStatusStr struct {
	NullPostStatus
}

func NewNullPostStatusStr(val interface{}) (x NullPostStatusStr) {
	x.Scan(val) // yes, we ignore this error, it will just be an invalid value.
	return
}

// Value implements the driver Valuer interface.
func (x NullPostStatusStr) Value() (driver.Value, error) {
	if !x.Valid {
		return nil, nil
	}
	return x.PostStatus.String(), nil
}

const (
	// PostTypeArticle is a PostType of type Article.
	PostTypeArticle PostType = iota
	// PostTypePicture is a PostType of type Picture.
	PostTypePicture
	// PostTypeVideo is a PostType of type Video.
	PostTypeVideo
	// PostTypeAudio is a PostType of type Audio.
	PostTypeAudio
)

var ErrInvalidPostType = fmt.Errorf("not a valid PostType, try [%s]", strings.Join(_PostTypeNames, ", "))

const _PostTypeName = "ArticlePictureVideoAudio"

var _PostTypeNames = []string{
	_PostTypeName[0:7],
	_PostTypeName[7:14],
	_PostTypeName[14:19],
	_PostTypeName[19:24],
}

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

// PostTypeValues returns a list of the values for PostType
func PostTypeValues() []PostType {
	return []PostType{
		PostTypeArticle,
		PostTypePicture,
		PostTypeVideo,
		PostTypeAudio,
	}
}

var _PostTypeMap = map[PostType]string{
	PostTypeArticle: _PostTypeName[0:7],
	PostTypePicture: _PostTypeName[7:14],
	PostTypeVideo:   _PostTypeName[14:19],
	PostTypeAudio:   _PostTypeName[19:24],
}

// String implements the Stringer interface.
func (x PostType) String() string {
	if str, ok := _PostTypeMap[x]; ok {
		return str
	}
	return fmt.Sprintf("PostType(%d)", x)
}

// IsValid provides a quick way to determine if the typed value is
// part of the allowed enumerated values
func (x PostType) IsValid() bool {
	_, ok := _PostTypeMap[x]
	return ok
}

var _PostTypeValue = map[string]PostType{
	_PostTypeName[0:7]:   PostTypeArticle,
	_PostTypeName[7:14]:  PostTypePicture,
	_PostTypeName[14:19]: PostTypeVideo,
	_PostTypeName[19:24]: PostTypeAudio,
}

// ParsePostType attempts to convert a string to a PostType.
func ParsePostType(name string) (PostType, error) {
	if x, ok := _PostTypeValue[name]; ok {
		return x, nil
	}
	return PostType(0), fmt.Errorf("%s is %w", name, ErrInvalidPostType)
}

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

// Scan implements the Scanner interface.
func (x *PostType) Scan(value interface{}) (err error) {
	if value == nil {
		*x = PostType(0)
		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 = PostType(v)
	case string:
		*x, err = ParsePostType(v)
		if err != nil {
			// try parsing the integer value as a string
			if val, verr := strconv.Atoi(v); verr == nil {
				*x, err = PostType(val), nil
			}
		}
	case []byte:
		*x, err = ParsePostType(string(v))
		if err != nil {
			// try parsing the integer value as a string
			if val, verr := strconv.Atoi(string(v)); verr == nil {
				*x, err = PostType(val), nil
			}
		}
	case PostType:
		*x = v
	case int:
		*x = PostType(v)
	case *PostType:
		if v == nil {
			return errPostTypeNilPtr
		}
		*x = *v
	case uint:
		*x = PostType(v)
	case uint64:
		*x = PostType(v)
	case *int:
		if v == nil {
			return errPostTypeNilPtr
		}
		*x = PostType(*v)
	case *int64:
		if v == nil {
			return errPostTypeNilPtr
		}
		*x = PostType(*v)
	case float64: // json marshals everything as a float64 if it's a number
		*x = PostType(v)
	case *float64: // json marshals everything as a float64 if it's a number
		if v == nil {
			return errPostTypeNilPtr
		}
		*x = PostType(*v)
	case *uint:
		if v == nil {
			return errPostTypeNilPtr
		}
		*x = PostType(*v)
	case *uint64:
		if v == nil {
			return errPostTypeNilPtr
		}
		*x = PostType(*v)
	case *string:
		if v == nil {
			return errPostTypeNilPtr
		}
		*x, err = ParsePostType(*v)
		if err != nil {
			// try parsing the integer value as a string
			if val, verr := strconv.Atoi(*v); verr == nil {
				*x, err = PostType(val), nil
			}
		}
	}

	return
}

// Value implements the driver Valuer interface.
func (x PostType) Value() (driver.Value, error) {
	return int64(x), nil
}

// Set implements the Golang flag.Value interface func.
func (x *PostType) Set(val string) error {
	v, err := ParsePostType(val)
	*x = v
	return err
}

// Get implements the Golang flag.Getter interface func.
func (x *PostType) Get() interface{} {
	return *x
}

// Type implements the github.com/spf13/pFlag Value interface.
func (x *PostType) Type() string {
	return "PostType"
}

type NullPostType struct {
	PostType PostType
	Valid    bool
}

func NewNullPostType(val interface{}) (x NullPostType) {
	x.Scan(val) // yes, we ignore this error, it will just be an invalid value.
	return
}

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

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

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

type NullPostTypeStr struct {
	NullPostType
}

func NewNullPostTypeStr(val interface{}) (x NullPostTypeStr) {
	x.Scan(val) // yes, we ignore this error, it will just be an invalid value.
	return
}

// Value implements the driver Valuer interface.
func (x NullPostTypeStr) Value() (driver.Value, error) {
	if !x.Valid {
		return nil, nil
	}
	return x.PostType.String(), nil
}
