package checker import ( "context" "fmt" sdk "git.happydns.org/checker-sdk-go/checker" ) // Defaults are centralised so Definition's docs and runtime reads cannot drift. const ( defaultMaxChainLength = 8 defaultMinTargetTTL = 60 defaultRequireResolvableTarget = true defaultAllowApexCNAME = false defaultRecognizeApexFlattening = true // hintKey is the CheckState.Meta key the HTML report reads to render the // "How to fix" block: keep them in sync. hintKey = "hint" ) func loadAlias(ctx context.Context, obs sdk.ObservationGetter) (*AliasData, []sdk.CheckState) { var data AliasData if err := obs.Get(ctx, ObservationKeyAlias, &data); err != nil { return nil, []sdk.CheckState{{ Status: sdk.StatusError, Message: fmt.Sprintf("failed to read alias observation: %v", err), }} } return &data, nil } // skipped is the "nothing to judge right now" return: rules must produce at // least one state, otherwise the SDK substitutes StatusUnknown. func skipped(reason string) []sdk.CheckState { return []sdk.CheckState{{ Status: sdk.StatusUnknown, Message: "skipped: " + reason, }} } func okState(subject, message string) []sdk.CheckState { return []sdk.CheckState{{ Status: sdk.StatusOK, Subject: subject, Message: message, }} } // withHint is a no-op when hint is empty so callers can pass through unchecked. func withHint(s sdk.CheckState, hint string) sdk.CheckState { if hint == "" { return s } if s.Meta == nil { s.Meta = map[string]any{} } s.Meta[hintKey] = hint return s } // apexKnown gates chain-oriented rules with a uniform "apex lookup failed" // skip line so the UI stays consistent across rules. func apexKnown(data *AliasData) bool { return data.ApexLookupError == "" && data.Apex != "" } func allowApexCNAME(opts sdk.CheckerOptions) bool { return sdk.GetBoolOption(opts, "allowApexCNAME", defaultAllowApexCNAME) } func recognizeApexFlattening(opts sdk.CheckerOptions) bool { return sdk.GetBoolOption(opts, "recognizeApexFlattening", defaultRecognizeApexFlattening) }