package mw type MW struct { S string I int } func New(s string) MW { w := MW{S: s} for w.I < len(s) && s[w.I] != '[' { w.I++ } if w.I < len(s) { w.I++ } return w } func (w *MW) Sep() { for w.I < len(w.S) { c := w.S[w.I] if c != ' ' && c != '\n' && c != '\r' && c != '\t' && c != ',' { break } w.I++ } } func (w *MW) Str() string { w.Sep() if w.I >= len(w.S) || w.S[w.I] != '"' { return "" } w.I++ start := w.I for w.I < len(w.S) && w.S[w.I] != '"' { if w.S[w.I] == '\\' { w.I++ } w.I++ } if w.I >= len(w.S) { return "" } result := w.S[start:w.I] w.I++ return result } func (w *MW) Num() int64 { w.Sep() neg := false if w.I < len(w.S) && w.S[w.I] == '-' { neg = true w.I++ } var n int64 for w.I < len(w.S) && w.S[w.I] >= '0' && w.S[w.I] <= '9' { n = n*10 + int64(w.S[w.I]-'0') w.I++ } if neg { n = -n } return n } func (w *MW) Raw() string { w.Sep() start := w.I w.I = Skipval(w.S, w.I) if w.I < 0 { w.I = len(w.S) return "" } return w.S[start:w.I] } func (w *MW) Strs() []string { w.Sep() if w.I >= len(w.S) || w.S[w.I] != '[' { return nil } w.I++ var out []string for { w.Sep() if w.I >= len(w.S) || w.S[w.I] == ']' { if w.I < len(w.S) { w.I++ } return out } s := w.Str() out = append(out, s) } } func Skipval(s string, i int) int { if i >= len(s) { return -1 } c := s[i] if c == '"' { i++ for i < len(s) && s[i] != '"' { if s[i] == '\\' { i++ } i++ } if i >= len(s) { return -1 } return i + 1 } if c == '{' || c == '[' { open := c close := byte('}') if open == '[' { close = ']' } depth := 1 i++ for i < len(s) && depth > 0 { if s[i] == '"' { i++ for i < len(s) && s[i] != '"' { if s[i] == '\\' { i++ } i++ } if i >= len(s) { return -1 } i++ continue } if s[i] == open { depth++ } else if s[i] == close { depth-- if depth == 0 { return i + 1 } } i++ } return -1 } for i < len(s) { c := s[i] if c == ',' || c == ']' || c == '}' { return i } i++ } return i }