package webutil

import "strconv"

func scan(raw string, val any) error {
	switch v := val.(type) {
	case *string:
		*v = raw
	case *int:
		if i, err := strconv.ParseInt(raw, 10, 64); err != nil {
			return err
		} else {
			*v = int(i)
		}
	case *int8:
		if i, err := strconv.ParseInt(raw, 10, 8); err != nil {
			return err
		} else {
			*v = int8(i)
		}
	case *int16:
		if i, err := strconv.ParseInt(raw, 10, 16); err != nil {
			return err
		} else {
			*v = int16(i)
		}
	case *int32:
		if i, err := strconv.ParseInt(raw, 10, 32); err != nil {
			return err
		} else {
			*v = int32(i)
		}
	case *int64:
		if i, err := strconv.ParseInt(raw, 10, 64); err != nil {
			return err
		} else {
			*v = int64(i)
		}
	case *uint:
		if i, err := strconv.ParseUint(raw, 10, 64); err != nil {
			return err
		} else {
			*v = uint(i)
		}
	case *uint8:
		if i, err := strconv.ParseUint(raw, 10, 8); err != nil {
			return err
		} else {
			*v = uint8(i)
		}
	case *uint16:
		if i, err := strconv.ParseUint(raw, 10, 16); err != nil {
			return err
		} else {
			*v = uint16(i)
		}
	case *uint32:
		if i, err := strconv.ParseUint(raw, 10, 32); err != nil {
			return err
		} else {
			*v = uint32(i)
		}
	case *uint64:
		if i, err := strconv.ParseUint(raw, 10, 64); err != nil {
			return err
		} else {
			*v = uint64(i)
		}
	case *float32:
		if f, err := strconv.ParseFloat(raw, 32); err != nil {
			return err
		} else {
			*v = float32(f)
		}
	case *float64:
		if f, err := strconv.ParseFloat(raw, 64); err != nil {
			return err
		} else {
			*v = float64(f)
		}
	default:
		return ErrUnsupportedType
	}
	return nil
}