diff --git a/CLAUDE.md b/CLAUDE.md index 68626bf2..86bc20ad 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -202,3 +202,4 @@ See [doc/howto/TESTING.md](doc/howto/TESTING.md) for full testing guide. 1. **Structured logging** — `zap.SugaredLogger` with `Debugw`/`Infow`/`Errorw(msg, key, val, ...)`. Never unstructured methods. 2. **Interfaces for behavior, structs for data** — use interfaces for behavioral contracts (Consumer, Controller, Storage). Use structs for data containers, configs, and registries (TopicRegistry, SubscriptionConfig). 3. **Value types over pointers** — prefer value types for structs, configs, and return values. Use `(T, bool)` to signal absence instead of `*T`. Pointers only when mutation or shared ownership is needed. +4. **Errors for failures, not control flow** — reserve `error` returns for unexpected or infrastructure failures. Use result types (structs, bools) for expected outcomes like `(Result, error)` or `(T, bool)`. Avoid sentinel errors that represent non-failure states. diff --git a/extension/mergechecker/BUILD.bazel b/extension/mergechecker/BUILD.bazel new file mode 100644 index 00000000..39e2c33c --- /dev/null +++ b/extension/mergechecker/BUILD.bazel @@ -0,0 +1,9 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "mergechecker", + srcs = ["mergechecker.go"], + importpath = "github.com/uber/submitqueue/extension/mergechecker", + visibility = ["//visibility:public"], + deps = ["//entity"], +) diff --git a/extension/mergechecker/mergechecker.go b/extension/mergechecker/mergechecker.go new file mode 100644 index 00000000..ba1690ac --- /dev/null +++ b/extension/mergechecker/mergechecker.go @@ -0,0 +1,21 @@ +package mergechecker + +import ( + "context" + + "github.com/uber/submitqueue/entity" +) + +// MergeChecker predicts whether a request's changes can merge cleanly. +type MergeChecker interface { + // Check is a fail-fast validation that optimistically assesses the + // mergeability of the request. A positive result does not guarantee + // that the changes will apply cleanly at merge finalization time. + Check(ctx context.Context, request entity.Request) (Result, error) +} + +// Result holds the outcome of a merge check. +type Result struct { + // Mergeable is true if the request's changes are expected to merge cleanly. + Mergeable bool +}