1 // In this file, JSON refers to WTF-JSON, a variant of JSON used by Minetest
2 // where \u00XX escapes in string literals act like Go's \xXX escapes.
27 func (m ItemMeta) Field(name string) (s string, ok bool) {
28 if len(m) > 0 && m[0] == 1 {
30 eat := func(stop byte) string {
31 for i := 0; i < len(m); i++ {
54 return string(m), true
60 func (s Stack) String() string {
68 } else if s.Wear > 0 {
70 } else if s.Count > 1 {
74 return strings.Join([]string{
78 optJSONStr(string(s.ItemMeta)),
82 func optJSONStr(s string) string {
84 if r <= ' ' || r == '"' || r >= utf8.RuneSelf {
91 func jsonStr(s string) string {
103 b := new(strings.Builder)
106 for i := 0; i < len(s); i++ {
109 fmt.Fprintf(b, "\\%c", esc[c])
110 case ' ' <= c && c <= '~':
113 fmt.Fprintf(b, "\\u%04x", c)
121 func (stk *Stack) Scan(state fmt.ScanState, verb rune) (err error) {
130 nm, err := scanOptJSONStr(state)
137 if _, err := fmt.Fscan(state, &stk.Count, &stk.Wear); err != nil {
141 s, err := scanOptJSONStr(state)
145 stk.ItemMeta = ItemMeta(s)
150 func scanOptJSONStr(state fmt.ScanState) (string, error) {
153 r, _, err := state.ReadRune()
160 return scanJSONStr(state)
163 token, err := state.Token(false, func(r rune) bool { return r != ' ' })
164 return string(token), err
167 func scanJSONStr(state fmt.ScanState) (s string, rerr error) {
168 r, _, err := state.ReadRune()
173 return "", fmt.Errorf("unexpected rune: %q", r)
178 rerr = io.ErrUnexpectedEOF
182 b := new(strings.Builder)
184 r, _, err := state.ReadRune()
186 return b.String(), err
191 return b.String(), nil
193 r, _, err := state.ReadRune()
195 return b.String(), err
214 r, _, err := state.ReadRune()
216 return b.String(), err
220 n, err := strconv.ParseUint(string(hex[:]), 16, 8)
222 return b.String(), err
226 return b.String(), fmt.Errorf("invalid escape: \\%c", r)