func setVal(v reflect.Value, pValue interface{}) string {
	switch v.Kind() {
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
		x, ok := pValue.(int64)
		if !ok && pValue != nil {
			return typeMismatchReason(pValue, v)
		}
		if v.OverflowInt(x) {
			return fmt.Sprintf("value %v overflows struct field of type %v", x, v.Type())
		}
		v.SetInt(x)
	case reflect.Bool:
		x, ok := pValue.(bool)
		if !ok && pValue != nil {
			return typeMismatchReason(pValue, v)
		}
		v.SetBool(x)
	case reflect.String:
		switch x := pValue.(type) {
		case appengine.BlobKey:
			v.SetString(string(x))
		case ByteString:
			v.SetString(string(x))
		case string:
			v.SetString(x)
		default:
			if pValue != nil {
				return typeMismatchReason(pValue, v)
			}
		}
	case reflect.Float32, reflect.Float64:
		x, ok := pValue.(float64)
		if !ok && pValue != nil {
			return typeMismatchReason(pValue, v)
		}
		if v.OverflowFloat(x) {
			return fmt.Sprintf("value %v overflows struct field of type %v", x, v.Type())
		}
		v.SetFloat(x)
	case reflect.Ptr:
		x, ok := pValue.(*Key)
		if !ok && pValue != nil {
			return typeMismatchReason(pValue, v)
		}
		if _, ok := v.Interface().(*Key); !ok {
			return typeMismatchReason(pValue, v)
		}
		v.Set(reflect.ValueOf(x))
	case reflect.Struct:
		switch v.Type() {
		case typeOfTime:
			x, ok := pValue.(time.Time)
			if !ok && pValue != nil {
				return typeMismatchReason(pValue, v)
			}
			v.Set(reflect.ValueOf(x))
		case typeOfGeoPoint:
			x, ok := pValue.(appengine.GeoPoint)
			if !ok && pValue != nil {
				return typeMismatchReason(pValue, v)
			}
			v.Set(reflect.ValueOf(x))
		default:
			ent, ok := pValue.(*Entity)
			if !ok {
				return typeMismatchReason(pValue, v)
			}

			// Recursively load nested struct
			pls, err := newStructPLS(v.Addr().Interface())
			if err != nil {
				return err.Error()
			}

			// if ent has a Key value and our struct has a Key field,
			// load the Entity's Key value into the Key field on the struct.
			if ent.Key != nil && pls.codec.keyField != -1 {

				pls.v.Field(pls.codec.keyField).Set(reflect.ValueOf(ent.Key))
			}

			err = pls.Load(ent.Properties)
			if err != nil {
				return err.Error()
			}
		}
	case reflect.Slice:
		x, ok := pValue.([]byte)
		if !ok {
			if y, yok := pValue.(ByteString); yok {
				x, ok = []byte(y), true
			}
		}
		if !ok && pValue != nil {
			return typeMismatchReason(pValue, v)
		}
		if v.Type().Elem().Kind() != reflect.Uint8 {
			return typeMismatchReason(pValue, v)
		}
		v.SetBytes(x)
	default:
		return typeMismatchReason(pValue, v)
	}
	return ""
}
func setVal(v reflect.Value, pValue interface{}) string {
	switch v.Kind() {
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
		x, ok := pValue.(int64)
		if !ok && pValue != nil {
			return typeMismatchReason(pValue, v)
		}
		if v.OverflowInt(x) {
			return fmt.Sprintf("value %v overflows struct field of type %v", x, v.Type())
		}
		v.SetInt(x)
	case reflect.Bool:
		x, ok := pValue.(bool)
		if !ok && pValue != nil {
			return typeMismatchReason(pValue, v)
		}
		v.SetBool(x)
	case reflect.String:
		switch x := pValue.(type) {
		case appengine.BlobKey:
			v.SetString(string(x))
		case ByteString:
			v.SetString(string(x))
		case string:
			v.SetString(x)
		default:
			if pValue != nil {
				return typeMismatchReason(pValue, v)
			}
		}
	case reflect.Float32, reflect.Float64:
		x, ok := pValue.(float64)
		if !ok && pValue != nil {
			return typeMismatchReason(pValue, v)
		}
		if v.OverflowFloat(x) {
			return fmt.Sprintf("value %v overflows struct field of type %v", x, v.Type())
		}
		v.SetFloat(x)
	case reflect.Ptr:
		x, ok := pValue.(*Key)
		if !ok && pValue != nil {
			return typeMismatchReason(pValue, v)
		}
		if _, ok := v.Interface().(*Key); !ok {
			return typeMismatchReason(pValue, v)
		}
		v.Set(reflect.ValueOf(x))
	case reflect.Struct:
		switch v.Type() {
		case typeOfTime:
			x, ok := pValue.(time.Time)
			if !ok && pValue != nil {
				return typeMismatchReason(pValue, v)
			}
			v.Set(reflect.ValueOf(x))
		case typeOfGeoPoint:
			x, ok := pValue.(appengine.GeoPoint)
			if !ok && pValue != nil {
				return typeMismatchReason(pValue, v)
			}
			v.Set(reflect.ValueOf(x))
		default:
			ent, ok := pValue.(*Entity)
			if !ok {
				return typeMismatchReason(pValue, v)
			}

			
			pls, err := newStructPLS(v.Addr().Interface())
			if err != nil {
				return err.Error()
			}

			
			
			if ent.Key != nil && pls.codec.keyField != -1 {

				pls.v.Field(pls.codec.keyField).Set(reflect.ValueOf(ent.Key))
			}

			err = pls.Load(ent.Properties)
			if err != nil {
				return err.Error()
			}
		}
	case reflect.Slice:
		x, ok := pValue.([]byte)
		if !ok {
			if y, yok := pValue.(ByteString); yok {
				x, ok = []byte(y), true
			}
		}
		if !ok && pValue != nil {
			return typeMismatchReason(pValue, v)
		}
		if v.Type().Elem().Kind() != reflect.Uint8 {
			return typeMismatchReason(pValue, v)
		}
		v.SetBytes(x)
	default:
		return typeMismatchReason(pValue, v)
	}
	return ""
}
func setVal ( v reflect . Value , pValue interface { } ) string { switch v . Kind ( ) { case reflect . Int , reflect . Int8 , reflect . Int16 , reflect . Int32 , reflect . Int64 : x , ok := pValue . ( int64 ) if ! ok && pValue != nil { return typeMismatchReason ( pValue , v ) } if v . OverflowInt ( x ) { return fmt . Sprintf ( " " , x , v . Type ( ) ) } v . SetInt ( x ) case reflect . Bool : x , ok := pValue . ( bool ) if ! ok && pValue != nil { return typeMismatchReason ( pValue , v ) } v . SetBool ( x ) case reflect . String : switch x := pValue . ( type ) { case appengine . BlobKey : v . SetString ( string ( x ) ) case ByteString : v . SetString ( string ( x ) ) case string : v . SetString ( x ) default : if pValue != nil { return typeMismatchReason ( pValue , v ) } } case reflect . Float32 , reflect . Float64 : x , ok := pValue . ( float64 ) if ! ok && pValue != nil { return typeMismatchReason ( pValue , v ) } if v . OverflowFloat ( x ) { return fmt . Sprintf ( " " , x , v . Type ( ) ) } v . SetFloat ( x ) case reflect . Ptr : x , ok := pValue . ( * Key ) if ! ok && pValue != nil { return typeMismatchReason ( pValue , v ) } if _ , ok := v . Interface ( ) . ( * Key ) ; ! ok { return typeMismatchReason ( pValue , v ) } v . Set ( reflect . ValueOf ( x ) ) case reflect . Struct : switch v . Type ( ) { case typeOfTime : x , ok := pValue . ( time . Time ) if ! ok && pValue != nil { return typeMismatchReason ( pValue , v ) } v . Set ( reflect . ValueOf ( x ) ) case typeOfGeoPoint : x , ok := pValue . ( appengine . GeoPoint ) if ! ok && pValue != nil { return typeMismatchReason ( pValue , v ) } v . Set ( reflect . ValueOf ( x ) ) default : ent , ok := pValue . ( * Entity ) if ! ok { return typeMismatchReason ( pValue , v ) } // Recursively load nested struct pls , err := newStructPLS ( v . Addr ( ) . Interface ( ) ) if err != nil { return err . Error ( ) } // if ent has a Key value and our struct has a Key field, // load the Entity's Key value into the Key field on the struct. if ent . Key != nil && pls . codec . keyField != - 1 { pls . v . Field ( pls . codec . keyField ) . Set ( reflect . ValueOf ( ent . Key ) ) } err = pls . Load ( ent . Properties ) if err != nil { return err . Error ( ) } } case reflect . Slice : x , ok := pValue . ( [ ] byte ) if ! ok { if y , yok := pValue . ( ByteString ) ; yok { x , ok = [ ] byte ( y ) , true } } if ! ok && pValue != nil { return typeMismatchReason ( pValue , v ) } if v . Type ( ) . Elem ( ) . Kind ( ) != reflect . Uint8 { return typeMismatchReason ( pValue , v ) } v . SetBytes ( x ) default : return typeMismatchReason ( pValue , v ) } return " " }
// setVal sets v to the value pValue.
setVal sets v to the value pValue .