93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package hujson
|
|
|
|
// UpdateOffsets iterates through v and updates all
|
|
// Value.StartOffset and Value.EndOffset fields so that they are accurate.
|
|
func (v *Value) UpdateOffsets() {
|
|
v.updateOffsets(0)
|
|
}
|
|
func (v *Value) updateOffsets(n int) int {
|
|
n += len(v.BeforeExtra)
|
|
v.StartOffset = n
|
|
switch v2 := v.Value.(type) {
|
|
case Literal:
|
|
n += len(v2)
|
|
case *Object:
|
|
n += len("{")
|
|
for i := range v2.Members {
|
|
n = v2.Members[i].Name.updateOffsets(n)
|
|
n += len(":")
|
|
n = v2.Members[i].Value.updateOffsets(n)
|
|
n += len(",")
|
|
}
|
|
if v2.length() > 0 && !hasTrailingComma(v2) {
|
|
n -= len(",")
|
|
}
|
|
n += len(v2.AfterExtra)
|
|
n += len("}")
|
|
case *Array:
|
|
n += len("[")
|
|
for i := range v2.Elements {
|
|
n = v2.Elements[i].updateOffsets(n)
|
|
n += len(",")
|
|
}
|
|
if v2.length() > 0 && !hasTrailingComma(v2) {
|
|
n -= len(",")
|
|
}
|
|
n += len(v2.AfterExtra)
|
|
n += len("]")
|
|
}
|
|
v.EndOffset = n
|
|
n += len(v.AfterExtra)
|
|
return n
|
|
}
|
|
|
|
// Pack serializes the value as HuJSON.
|
|
// The output is valid so long as every Extra and Literal in the Value is valid.
|
|
// The output does not alias the memory of any buffers referenced by v.
|
|
func (v Value) Pack() []byte {
|
|
return v.append(nil)
|
|
}
|
|
|
|
// String is a string representation of v.
|
|
func (v Value) String() string {
|
|
return string(v.append(nil))
|
|
}
|
|
|
|
func (v Value) append(b []byte) []byte {
|
|
b = append(b, v.BeforeExtra...)
|
|
switch v2 := v.Value.(type) {
|
|
case Literal:
|
|
b = append(b, v2...)
|
|
case *Object:
|
|
b = append(b, '{')
|
|
for _, m := range v2.Members {
|
|
b = m.Name.append(b)
|
|
b = append(b, ':')
|
|
b = m.Value.append(b)
|
|
b = append(b, ',')
|
|
}
|
|
if v2.length() > 0 && !hasTrailingComma(v2) {
|
|
b = b[:len(b)-1]
|
|
}
|
|
b = append(b, v2.AfterExtra...)
|
|
b = append(b, '}')
|
|
case *Array:
|
|
b = append(b, '[')
|
|
for _, e := range v2.Elements {
|
|
b = e.append(b)
|
|
b = append(b, ',')
|
|
}
|
|
if v2.length() > 0 && !hasTrailingComma(v2) {
|
|
b = b[:len(b)-1]
|
|
}
|
|
b = append(b, v2.AfterExtra...)
|
|
b = append(b, ']')
|
|
}
|
|
b = append(b, v.AfterExtra...)
|
|
return b
|
|
}
|