mirror of https://github.com/databricks/cli.git
54 lines
1.0 KiB
Go
54 lines
1.0 KiB
Go
package jsonloader
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"github.com/databricks/cli/libs/dyn"
|
|
)
|
|
|
|
type LineOffset struct {
|
|
Line int
|
|
Start int64
|
|
}
|
|
|
|
type Offset struct {
|
|
offsets []LineOffset
|
|
source string
|
|
}
|
|
|
|
// buildLineOffsets scans the input data and records the starting byte offset of each line.
|
|
func BuildLineOffsets(data []byte) Offset {
|
|
offsets := []LineOffset{{Line: 1, Start: 0}}
|
|
line := 1
|
|
for i, b := range data {
|
|
if b == '\n' {
|
|
line++
|
|
offsets = append(offsets, LineOffset{Line: line, Start: int64(i + 1)})
|
|
}
|
|
}
|
|
return Offset{offsets: offsets}
|
|
}
|
|
|
|
// GetPosition maps a byte offset to its corresponding line and column numbers.
|
|
func (o Offset) GetPosition(offset int64) dyn.Location {
|
|
// Binary search to find the line
|
|
idx := sort.Search(len(o.offsets), func(i int) bool {
|
|
return o.offsets[i].Start > offset
|
|
}) - 1
|
|
|
|
if idx < 0 {
|
|
idx = 0
|
|
}
|
|
|
|
lineOffset := o.offsets[idx]
|
|
return dyn.Location{
|
|
File: o.source,
|
|
Line: lineOffset.Line,
|
|
Column: int(offset-lineOffset.Start) + 1,
|
|
}
|
|
}
|
|
|
|
func (o *Offset) SetSource(source string) {
|
|
o.source = source
|
|
}
|