shithub: furgit

ref: aa048b1320e5ae4a72a1927476460955a8727c52
dir: /format/commitgraph/read/position.go/

View raw version
package read

import (
	"fmt"

	"codeberg.org/lindenii/furgit/internal/intconv"
)

// Position identifies one commit record by layer and row index.
type Position struct {
	Graph uint32
	Index uint32
}

func (reader *Reader) globalToPosition(global uint32) (Position, error) {
	for i := range reader.layers {
		layer := &reader.layers[i]
		from := layer.globalFrom

		to := from + layer.numCommits
		if global >= from && global < to {
			graph, err := intconv.IntToUint32(i)
			if err != nil {
				return Position{}, err
			}

			return Position{
				Graph: graph,
				Index: global - from,
			}, nil
		}
	}

	return Position{}, &MalformedError{
		Path:   "commit-graph",
		Reason: fmt.Sprintf("parent global position out of range: %d", global),
	}
}