// Package core holds the pure domain logic of compare.sr.ht: input
// validation (owner/repo/ref names), the compare-spec grammar, and the
// sentinel errors shared across the service. It has no external dependencies
// and never touches the network or the filesystem, so it is cheap to test.
package core
import "errors"
// Sentinel errors. Callers compare with errors.Is; wrapping with %w adds
// human-readable detail without losing the class.
var (
// ErrNotFound is returned when a repo, ref, or object does not exist —
// or, for authorization, when the viewer is not allowed to know it
// exists. Handlers map this to HTTP 404 (never 403, so private-repo
// existence is not leaked).
ErrNotFound = errors.New("not found")
// ErrForbidden marks an operation the viewer is authenticated for but
// not permitted to perform. Repo visibility deliberately uses
// ErrNotFound instead; ErrForbidden is reserved for genuine 403 cases.
ErrForbidden = errors.New("forbidden")
// ErrBadRef is returned for malformed compare specs or refs that fail
// check-ref-format validation. Handlers map this to HTTP 400.
ErrBadRef = errors.New("invalid git ref")
// ErrTruncated signals that git output exceeded the in-page size cap.
// The handler renders the file list plus a link to the raw .patch.
ErrTruncated = errors.New("output truncated")
)