aboutsummaryrefslogblamecommitdiffstats
path: root/vendor/github.com/graph-gophers/graphql-go/time.go
blob: 829c502275d7da5c769a03247e944f68e4baa251 (plain) (tree)


















































                                                                                                
package graphql

import (
    "encoding/json"
    "fmt"
    "time"
)

// Time is a custom GraphQL type to represent an instant in time. It has to be added to a schema
// via "scalar Time" since it is not a predeclared GraphQL type like "ID".
type Time struct {
    time.Time
}

// ImplementsGraphQLType maps this custom Go type
// to the graphql scalar type in the schema.
func (Time) ImplementsGraphQLType(name string) bool {
    return name == "Time"
}

// UnmarshalGraphQL is a custom unmarshaler for Time
//
// This function will be called whenever you use the
// time scalar as an input
func (t *Time) UnmarshalGraphQL(input interface{}) error {
    switch input := input.(type) {
    case time.Time:
        t.Time = input
        return nil
    case string:
        var err error
        t.Time, err = time.Parse(time.RFC3339, input)
        return err
    case int:
        t.Time = time.Unix(int64(input), 0)
        return nil
    case float64:
        t.Time = time.Unix(int64(input), 0)
        return nil
    default:
        return fmt.Errorf("wrong type")
    }
}

// MarshalJSON is a custom marshaler for Time
//
// This function will be called whenever you
// query for fields that use the Time type
func (t Time) MarshalJSON() ([]byte, error) {
    return json.Marshal(t.Time)
}