package schema

import (
	
	
	
	
	
	
	
	

	

	
	
	
)

var scannerType = reflect.TypeOf((*sql.Scanner)(nil)).Elem()

type ScannerFunc func(dest reflect.Value, src interface{}) error

var scanners []ScannerFunc

func () {
	scanners = []ScannerFunc{
		reflect.Bool:          scanBool,
		reflect.Int:           scanInt64,
		reflect.Int8:          scanInt64,
		reflect.Int16:         scanInt64,
		reflect.Int32:         scanInt64,
		reflect.Int64:         scanInt64,
		reflect.Uint:          scanUint64,
		reflect.Uint8:         scanUint64,
		reflect.Uint16:        scanUint64,
		reflect.Uint32:        scanUint64,
		reflect.Uint64:        scanUint64,
		reflect.Uintptr:       scanUint64,
		reflect.Float32:       scanFloat64,
		reflect.Float64:       scanFloat64,
		reflect.Complex64:     nil,
		reflect.Complex128:    nil,
		reflect.Array:         nil,
		reflect.Interface:     scanInterface,
		reflect.Map:           scanJSON,
		reflect.Ptr:           nil,
		reflect.Slice:         scanJSON,
		reflect.String:        scanString,
		reflect.Struct:        scanJSON,
		reflect.UnsafePointer: nil,
	}
}

func ( Dialect,  *Field) ScannerFunc {
	if .Tag.HasOption("msgpack") {
		return scanMsgpack
	}
	if .Tag.HasOption("json_use_number") {
		return scanJSONUseNumber
	}
	if .StructField.Type.Kind() == reflect.Interface {
		switch strings.ToUpper(.UserSQLType) {
		case sqltype.JSON, sqltype.JSONB:
			return scanJSONIntoInterface
		}
	}
	return .Scanner(.StructField.Type)
}

func ( reflect.Type) ScannerFunc {
	 := .Kind()

	if  == reflect.Ptr {
		if  := (.Elem());  != nil {
			return PtrScanner()
		}
	}

	switch  {
	case timeType:
		return scanTime
	case ipType:
		return scanIP
	case ipNetType:
		return scanIPNet
	case jsonRawMessageType:
		return scanBytes
	}

	if .Implements(scannerType) {
		return scanScanner
	}

	if  != reflect.Ptr {
		 := reflect.PtrTo()
		if .Implements(scannerType) {
			return addrScanner(scanScanner)
		}
	}

	if .Kind() == reflect.Slice && .Elem().Kind() == reflect.Uint8 {
		return scanBytes
	}

	return scanners[]
}

func ( reflect.Value,  interface{}) error {
	switch src := .(type) {
	case nil:
		.SetBool(false)
		return nil
	case bool:
		.SetBool()
		return nil
	case int64:
		.SetBool( != 0)
		return nil
	case []byte:
		if len() == 1 {
			.SetBool([0] != '0')
			return nil
		}
	}
	return fmt.Errorf("bun: can't scan %#v into %s", , .Type())
}

func ( reflect.Value,  interface{}) error {
	switch src := .(type) {
	case nil:
		.SetInt(0)
		return nil
	case int64:
		.SetInt()
		return nil
	case uint64:
		.SetInt(int64())
		return nil
	case []byte:
		,  := strconv.ParseInt(internal.String(), 10, 64)
		if  != nil {
			return 
		}
		.SetInt()
		return nil
	case string:
		,  := strconv.ParseInt(, 10, 64)
		if  != nil {
			return 
		}
		.SetInt()
		return nil
	}
	return fmt.Errorf("bun: can't scan %#v into %s", , .Type())
}

func ( reflect.Value,  interface{}) error {
	switch src := .(type) {
	case nil:
		.SetUint(0)
		return nil
	case uint64:
		.SetUint()
		return nil
	case int64:
		.SetUint(uint64())
		return nil
	case []byte:
		,  := strconv.ParseUint(internal.String(), 10, 64)
		if  != nil {
			return 
		}
		.SetUint()
		return nil
	}
	return fmt.Errorf("bun: can't scan %#v into %s", , .Type())
}

func ( reflect.Value,  interface{}) error {
	switch src := .(type) {
	case nil:
		.SetFloat(0)
		return nil
	case float64:
		.SetFloat()
		return nil
	case []byte:
		,  := strconv.ParseFloat(internal.String(), 64)
		if  != nil {
			return 
		}
		.SetFloat()
		return nil
	}
	return fmt.Errorf("bun: can't scan %#v into %s", , .Type())
}

func ( reflect.Value,  interface{}) error {
	switch src := .(type) {
	case nil:
		.SetString("")
		return nil
	case string:
		.SetString()
		return nil
	case []byte:
		.SetString(string())
		return nil
	case time.Time:
		.SetString(.Format(time.RFC3339Nano))
		return nil
	}
	return fmt.Errorf("bun: can't scan %#v into %s", , .Type())
}

func ( reflect.Value,  interface{}) error {
	switch src := .(type) {
	case nil:
		.SetBytes(nil)
		return nil
	case string:
		.SetBytes([]byte())
		return nil
	case []byte:
		 := make([]byte, len())
		copy(, )

		.SetBytes()
		return nil
	}
	return fmt.Errorf("bun: can't scan %#v into %s", , .Type())
}

func ( reflect.Value,  interface{}) error {
	switch src := .(type) {
	case nil:
		 := .Addr().Interface().(*time.Time)
		* = time.Time{}
		return nil
	case time.Time:
		 := .Addr().Interface().(*time.Time)
		* = 
		return nil
	case string:
		,  := internal.ParseTime()
		if  != nil {
			return 
		}
		 := .Addr().Interface().(*time.Time)
		* = 
		return nil
	case []byte:
		,  := internal.ParseTime(internal.String())
		if  != nil {
			return 
		}
		 := .Addr().Interface().(*time.Time)
		* = 
		return nil
	}
	return fmt.Errorf("bun: can't scan %#v into %s", , .Type())
}

func ( reflect.Value,  interface{}) error {
	return .Interface().(sql.Scanner).Scan()
}

func ( reflect.Value,  interface{}) error {
	if  == nil {
		return scanNull()
	}

	,  := toBytes()
	if  != nil {
		return 
	}

	 := msgpack.GetDecoder()
	defer msgpack.PutDecoder()

	.Reset(bytes.NewReader())
	return .DecodeValue()
}

func ( reflect.Value,  interface{}) error {
	if  == nil {
		return scanNull()
	}

	,  := toBytes()
	if  != nil {
		return 
	}

	return bunjson.Unmarshal(, .Addr().Interface())
}

func ( reflect.Value,  interface{}) error {
	if  == nil {
		return scanNull()
	}

	,  := toBytes()
	if  != nil {
		return 
	}

	 := bunjson.NewDecoder(bytes.NewReader())
	.UseNumber()
	return .Decode(.Addr().Interface())
}

func ( reflect.Value,  interface{}) error {
	if  == nil {
		return scanNull()
	}

	,  := toBytes()
	if  != nil {
		return 
	}

	 := net.ParseIP(internal.String())
	if  == nil {
		return fmt.Errorf("bun: invalid ip: %q", )
	}

	 := .Addr().Interface().(*net.IP)
	* = 

	return nil
}

func ( reflect.Value,  interface{}) error {
	if  == nil {
		return scanNull()
	}

	,  := toBytes()
	if  != nil {
		return 
	}

	, ,  := net.ParseCIDR(internal.String())
	if  != nil {
		return 
	}

	 := .Addr().Interface().(*net.IPNet)
	* = *

	return nil
}

func ( ScannerFunc) ScannerFunc {
	return func( reflect.Value,  interface{}) error {
		if !.CanAddr() {
			return fmt.Errorf("bun: Scan(nonaddressable %T)", .Interface())
		}
		return (.Addr(), )
	}
}

func ( interface{}) ([]byte, error) {
	switch src := .(type) {
	case string:
		return internal.Bytes(), nil
	case []byte:
		return , nil
	default:
		return nil, fmt.Errorf("bun: got %T, wanted []byte or string", )
	}
}

func ( ScannerFunc) ScannerFunc {
	return func( reflect.Value,  interface{}) error {
		if  == nil {
			if !.CanAddr() {
				if .IsNil() {
					return nil
				}
				return (.Elem(), )
			}

			if !.IsNil() {
				.Set(reflect.New(.Type().Elem()))
			}
			return nil
		}

		if .IsNil() {
			.Set(reflect.New(.Type().Elem()))
		}
		return (.Elem(), )
	}
}

func ( reflect.Value) error {
	if nilable(.Kind()) && .IsNil() {
		return nil
	}
	.Set(reflect.New(.Type()).Elem())
	return nil
}

func ( reflect.Value,  interface{}) error {
	if .IsNil() {
		if  == nil {
			return nil
		}

		,  := toBytes()
		if  != nil {
			return 
		}

		return bunjson.Unmarshal(, .Addr().Interface())
	}

	 = .Elem()
	if  := Scanner(.Type());  != nil {
		return (, )
	}
	return fmt.Errorf("bun: can't scan %#v into %s", , .Type())
}

func ( reflect.Value,  interface{}) error {
	if .IsNil() {
		if  == nil {
			return nil
		}
		.Set(reflect.ValueOf())
		return nil
	}

	 = .Elem()
	if  := Scanner(.Type());  != nil {
		return (, )
	}
	return fmt.Errorf("bun: can't scan %#v into %s", , .Type())
}

func ( reflect.Kind) bool {
	switch  {
	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
		return true
	}
	return false
}