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 {
164 return r != ' ' && r != '\n'
166 return string(token), err
169 func scanJSONStr(state fmt.ScanState) (s string, rerr error) {
170 r, _, err := state.ReadRune()
175 return "", fmt.Errorf("unexpected rune: %q", r)
180 rerr = io.ErrUnexpectedEOF
184 b := new(strings.Builder)
186 r, _, err := state.ReadRune()
188 return b.String(), err
193 return b.String(), nil
195 r, _, err := state.ReadRune()
197 return b.String(), err
216 r, _, err := state.ReadRune()
218 return b.String(), err
222 n, err := strconv.ParseUint(string(hex[:]), 16, 8)
224 return b.String(), err
228 return b.String(), fmt.Errorf("invalid escape: \\%c", r)