github.com/HaswinVidanage/gqlgen@v0.8.1-0.20220609041233-69528c1bf712/graphql/id.go (about)

     1  package graphql
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  	"strconv"
     8  )
     9  
    10  func MarshalID(s string) Marshaler {
    11  	return WriterFunc(func(w io.Writer) {
    12  		io.WriteString(w, strconv.Quote(s))
    13  	})
    14  }
    15  func UnmarshalID(v interface{}) (string, error) {
    16  	switch v := v.(type) {
    17  	case string:
    18  		return v, nil
    19  	case json.Number:
    20  		return string(v), nil
    21  	case int:
    22  		return strconv.Itoa(v), nil
    23  	case float64:
    24  		return fmt.Sprintf("%f", v), nil
    25  	case bool:
    26  		if v {
    27  			return "true", nil
    28  		} else {
    29  			return "false", nil
    30  		}
    31  	case nil:
    32  		return "null", nil
    33  	default:
    34  		return "", fmt.Errorf("%T is not a string", v)
    35  	}
    36  }
    37  
    38  func MarshalIntID(i int) Marshaler {
    39  	return WriterFunc(func(w io.Writer) {
    40  		writeQuotedString(w, strconv.Itoa(i))
    41  	})
    42  }
    43  
    44  func UnmarshalIntID(v interface{}) (int, error) {
    45  	switch v := v.(type) {
    46  	case string:
    47  		return strconv.Atoi(v)
    48  	case int:
    49  		return v, nil
    50  	case int64:
    51  		return int(v), nil
    52  	case json.Number:
    53  		return strconv.Atoi(string(v))
    54  	default:
    55  		return 0, fmt.Errorf("%T is not an int", v)
    56  	}
    57  }