package model

import (
	"database/sql/driver"
	"encoding/json"
	"fmt"
)

// JSONB helps store arbitrary metadata blobs.
type JSONB map[string]interface{}

func (j JSONB) Value() (driver.Value, error) {
	if j == nil {
		return "{}", nil
	}
	data, err := json.Marshal(j)
	if err != nil {
		return nil, err
	}
	return string(data), nil
}

func (j *JSONB) Scan(src interface{}) error {
	if src == nil {
		*j = JSONB{}
		return nil
	}
	switch value := src.(type) {
	case []byte:
		return json.Unmarshal(value, j)
	case string:
		return json.Unmarshal([]byte(value), j)
	default:
		return fmt.Errorf("unsupported type for JSONB: %T", src)
	}
}
