package hostops import ( "context" "encoding/json" "errors" "os" "github.com/carlosframework/platform/internal/provision" "github.com/carlosframework/platform/internal/release" ) func sequenceError(err error) error { if errors.Is(err, provision.ErrRecordSequence) { return ErrIdentity } if errors.Is(err, provision.ErrRecordSequenceExhausted) { return ErrPending } return err } func recordSequence(body []byte) (map[string]json.RawMessage, uint64, error) { fields, seq, err := provision.RecordSequence(body) return fields, seq, sequenceError(err) } func advanceRecordSequence(before, body []byte) ([]byte, error) { next, err := provision.AdvanceRecordSequence(before, body) return next, sequenceError(err) } // This claim-only boundary delegates encoding to provision, including when // an upstream typed writer has already prepared the same conditional Put. func putSequencedRecord(ctx context.Context, raw release.Store, key string, body []byte, etag string) (string, error) { before, seen, err := raw.Get(ctx, key) if errors.Is(err, os.ErrNotExist) { if etag != "" { return "", release.ErrCASConflict } before, seen = []byte(`{}`), "" } else if err != nil { return "", err } if seen != etag { return "", release.ErrCASConflict } MarkAppMutationIssued(ctx) tag, _, err := provision.WriteRecord(provision.WithRecordSequence(ctx), raw, key, before, body, etag) return tag, sequenceError(err) }