<%- package 'converters' -%>

<%-
  import "fmt"
  import "strconv"
  import "time"
  import "google.golang.org/appengine/datastore"
-%>

var NoModelGiven = fmt.Errorf("No model given")
var NoPayloadGiven = fmt.Errorf("No payload given")
var NoMediaTypeGiven = fmt.Errorf("No media type given")

func BoolPointerToBool(v *bool) bool {
	return BoolPointerToBoolWith(v, false)
}

func BoolPointerToBoolWith(v *bool, d bool) bool {
	if v == nil {
		return d
	}
	return *v
}

func IntPointerToInt(v *int) int {
	return IntPointerToIntWith(v, 0)
}

func IntPointerToIntWith(v *int, d int) int {
	if v == nil {
		return d
	}
	return *v
}

func IntToInt64(v int) int64 {
	return int64(v)
}

func IntToInt64Pointer(v int) *int64 {
	r := IntToInt64(v)
	return &r
}

func StringToStringPointer(v string) *string {
	return &v
}

func StringPointerToString(v *string) string {
	return StringPointerToStringWith(v, "")
}

func StringPointerToStringWith(v *string, d string) string {
	if v == nil {
		return d
	}
	return *v
}

func StringToInt64(v string) (int64, error) {
	return strconv.ParseInt(v, 10, 64)
}

func Int64ToString(v int64) string {
	return strconv.FormatInt(v, 10)
}

func Int64ToStringPointer(v int64) *string {
	s := Int64ToString(v)
	return &s
}

func StringToDatastoreKeyPointer(v string) (*datastore.Key, error) {
	return datastore.DecodeKey(v)
}

func StringPointerToDatastoreKeyPointer(v *string) (*datastore.Key, error) {
	if v == nil {
		return nil, nil
	}
	return StringToDatastoreKeyPointer(*v)
}

func DatastoreKeyPointerToString(key *datastore.Key) string {
	if key == nil {
		return ""
	}
	return key.Encode()
}

func DatastoreKeyPointerToStringPointer(key *datastore.Key) *string {
	if key == nil {
		return nil
	}
	s := DatastoreKeyPointerToString(key)
	return &s
}

func StringToTime(v string) (time.Time, error) {
	return time.Parse(time.RFC3339, v)
}

func StringPointerToTime(v *string) (time.Time, error) {
	if v == nil {
		return time.Time{}, nil
	}
	return StringToTime(*v)
}

func TimeToString(t time.Time) string {
	return t.Format(time.RFC3339)
}

func TimeToStringPointer(t time.Time) *string {
	s := TimeToString(t)
	return &s
}