package null

import (
	"database/sql/driver"
	"encoding/json"
	"gopkg.in/yaml.v2"
)

func (s NullString) Value() (driver.Value, error) {
	return s.String, nil
}

// MarshalJSON for NullInt64
func (i NullInt64) MarshalJSON() ([]byte, error) {
	if !i.Valid {
		return []byte("null"), nil
	}
	return json.Marshal(i.Int64)
}

// MarshalJSON for NullFloat64
func (f NullFloat64) MarshalJSON() ([]byte, error) {
	if !f.Valid {
		return []byte("null"), nil
	}
	return json.Marshal(f.Float64)
}

// MarshalJSON for NullBool
func (bb NullBool) MarshalJSON() ([]byte, error) {
	if !bb.Valid {
		return []byte("null"), nil
	}
	return json.Marshal(bb.Bool)
}

// MarshalJSON for NullString
func (s NullString) MarshalJSON() ([]byte, error) {
	if !s.Valid {
		return json.Marshal(nil)
	}
	return json.Marshal(s.String)
}

// MarshalYAML for NullInt64
func (i NullInt64) MarshalYAML() (interface{}, error) {
	if !i.Valid {
		return 0, nil
	}
	return yaml.Marshal(i.Int64)
}

// MarshalYAML for NullFloat64
func (f NullFloat64) MarshalYAML() (interface{}, error) {
	if !f.Valid {
		return 0.0, nil
	}
	return yaml.Marshal(f.Float64)
}

// MarshalYAML for NullBool
func (bb NullBool) MarshalYAML() (interface{}, error) {
	if !bb.Valid {
		return false, nil
	}
	return yaml.Marshal(bb.Bool)
}

// MarshalYAML for NullString
func (s NullString) MarshalYAML() (interface{}, error) {
	if !s.Valid {
		return "", nil
	}
	return yaml.Marshal(s.String)
}