github.com/wabain/gqlgen@v0.7.2/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 start := 0 14 io.WriteString(w, `"`) 15 16 for i, c := range s { 17 if c < 0x20 || c == '\\' || c == '"' { 18 io.WriteString(w, s[start:i]) 19 20 switch c { 21 case '\t': 22 io.WriteString(w, `\t`) 23 case '\r': 24 io.WriteString(w, `\r`) 25 case '\n': 26 io.WriteString(w, `\n`) 27 case '\\': 28 io.WriteString(w, `\\`) 29 case '"': 30 io.WriteString(w, `\"`) 31 default: 32 io.WriteString(w, `\u00`) 33 w.Write([]byte{encodeHex[c>>4], encodeHex[c&0xf]}) 34 } 35 36 start = i + 1 37 } 38 } 39 40 io.WriteString(w, s[start:]) 41 io.WriteString(w, `"`) 42 }) 43 } 44 func UnmarshalString(v interface{}) (string, error) { 45 switch v := v.(type) { 46 case string: 47 return v, nil 48 case int: 49 return strconv.Itoa(v), nil 50 case float64: 51 return fmt.Sprintf("%f", v), nil 52 case bool: 53 if v { 54 return "true", nil 55 } else { 56 return "false", nil 57 } 58 case nil: 59 return "null", nil 60 default: 61 return "", fmt.Errorf("%T is not a string", v) 62 } 63 }