github.com/HaswinVidanage/gqlgen@v0.8.1-0.20220609041233-69528c1bf712/graphql/string.go (about) 1 package graphql 2 3 import ( 4 "fmt" 5 "io" 6 "strconv" 7 ) 8 9 const encodeHex = "0123456789ABCDEF" 10 11 func MarshalString(s string) Marshaler { 12 return WriterFunc(func(w io.Writer) { 13 writeQuotedString(w, s) 14 }) 15 } 16 17 func writeQuotedString(w io.Writer, s string) { 18 start := 0 19 io.WriteString(w, `"`) 20 21 for i, c := range s { 22 if c < 0x20 || c == '\\' || c == '"' { 23 io.WriteString(w, s[start:i]) 24 25 switch c { 26 case '\t': 27 io.WriteString(w, `\t`) 28 case '\r': 29 io.WriteString(w, `\r`) 30 case '\n': 31 io.WriteString(w, `\n`) 32 case '\\': 33 io.WriteString(w, `\\`) 34 case '"': 35 io.WriteString(w, `\"`) 36 default: 37 io.WriteString(w, `\u00`) 38 w.Write([]byte{encodeHex[c>>4], encodeHex[c&0xf]}) 39 } 40 41 start = i + 1 42 } 43 } 44 45 io.WriteString(w, s[start:]) 46 io.WriteString(w, `"`) 47 } 48 49 func UnmarshalString(v interface{}) (string, error) { 50 switch v := v.(type) { 51 case string: 52 return v, nil 53 case int: 54 return strconv.Itoa(v), nil 55 case float64: 56 return fmt.Sprintf("%f", v), nil 57 case bool: 58 if v { 59 return "true", nil 60 } else { 61 return "false", nil 62 } 63 case nil: 64 return "null", nil 65 default: 66 return "", fmt.Errorf("%T is not a string", v) 67 } 68 }