Community程式設計與開發github.com

YarlisAISolutions/rules-cascade-go

在 Go 服務與工具(net/http、chi、gin、echo、gRPC、workers)中強制執行 Rule Cascade 規則,使用 rulescascade.com/go。適用於將規則整合至 Go 程式路徑、以引擎取代驗證標籤或手動檢查、或將規則結果對應至 HTTP 或 gRPC 錯誤。

rules-cascade-go 是什麼?

此技能提供在 Go 應用程式中整合 Rule Cascade 規則引擎的完整實作指南。它針對 Go 服務(包括 net/http、chi、gin、echo、gRPC 以及 background workers)的開發者設計,核心目標是將商業規則邏輯從程式碼中抽離,並交給統一的規則引擎管理。使用此技能時,開發者可在啟動時載入由 `rcas compile` 編譯的規則 bundle,並在每個請求處理過程中調用 `rules.Enforce` 進行評估。若規則違反,請求會收到標準化的 422 HTTP 錯誤(格式為 `application/problem+json`)或 gRPC 的 `FailedPrecondition` 狀態碼,並附帶詳細的 findings。此技能也提供了自動化分析現有驗證邏輯(如 validate 標籤、ozzo-validation、手動檢查)的工具與最佳實務,幫助開發者逐步遷移至規則引擎。此外,技能推薦使用 `rulehttp` 中介軟體來簡化整合,並支援透過 `rulecascade.NewHolder` 實現規則熱載入,適合 CI/CD 流程。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/YarlisAISolutions/rule-cascade-skills/tree/main/plugins/rules-cascade/skills/rules-cascade-go

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Go 中的 Rule Cascade

模組:go get rulescascade.com/go(Go 1.26+,除標準函式庫和 gopkg.in/yaml.v3 外無其他依賴)。bundle 由 rcas compile --all 產生至 build/rules/。絕不要在執行時期解析 YAML,也絕不要將規則複製到程式碼中。

載入一次,每次請求評估

import rulecascade "rulescascade.com/go"

// 在啟動時執行。任何錯誤:不要啟動。
data, err := os.ReadFile("build/rules/<ruleset-id>.bundle.json")
doc, err := rulecascade.ParseJSON(data)
rules, err := rulecascade.FromBundle(doc)

建議使用中介軟體(自 1.0.0-alpha.7 起):rulescascade.com/go/rulehttp 從 JSON 請求主體(保持可讀性)建立請求、執行強制,並以 422 問題詳情回應被拒絕的請求,這在所有 Rule Cascade 執行時期都是相同的。

mux.Handle("POST /orders", rulehttp.Enforce(rules, rulehttp.Options{Entity: "Order", Operation: "create",
	Actor: func(r *http.Request) map[string]any { return actorFromToken(r) }})(createOrder))
// 在處理程式中:rulehttp.FromContext(r.Context()) 是允許的結果

在其他地方,rules.Enforce(request, "server", nil) 回傳一個 *rulecascade.RuleViolation 錯誤(Problem() 是回應主體),而 rulehttp.WriteError(w, err) 則將其輸出。底層的 rules.Evaluate(request, "server", nil) 回傳一個 *rulecascade.Result(包含 Decision、Findings、Effects、Commands;result.Allowed())。*RuleSet 可安全地同時使用。每個有狀態變更的處理程式應遵循四個步驟:

  1. 在伺服器端評估,使用 map[string]any{"entity", "operation", "data", "original", "actor", "resolutions"}。 參與者來自驗證中介軟體,絕不來自呼叫端可以控制的標頭。使用 rulecascade.ParseJSON(或 json.Decoder.UseNumber())解碼請求主體,以確保數字保持精確。
  2. 拒絕時回應 422 application/problem+json(type: urn:rule-cascade:rule-violation)承載結果;對 gRPC 則使用 codes.FailedPrecondition,並將 findings 放在詳細資訊中。
  3. 持久化,在套用 compute 效果(Type == "value")之後:儲存伺服器的值。
  4. 在提交後執行 result.Commands,每個 IdempotencyKey 只執行一次(使用 outbox 表格或具有去重功能的 broker)。

放置方式:每個實體一個函式,用於建立請求並評估,從每個處理程式(net/http、chi、gin、echo 皆相同)呼叫。rulecascade.NewHolder 可以間隔或基於 cron 排程重新載入 bundle,並保留最後一次有效的規則。

取代現有的驗證

rcas analyze --module <module> 會列出 validate: 和 binding: 結構標籤、ozzo-validation、規則引擎、手動編寫的 errors.New 檢查、命名限制(const MaxQuantity = 10)、數字比較以及 switch 分支。帶有 drift 的候選項目表示專案的其他語言(通常是前端)以不同的值決定相同的名稱:必須由一個 ruleset 同時為兩者決定。在解碼階段保留形狀檢查;將商業決策移至規則。為舊檢查與引擎在相同輸入上添加表驅動的對等測試,然後刪除舊檢查。

測試

基於 Decision 和 finding 的 Code(而非訊息文字)進行表驅動測試。ruleset 中的黃金測試(rcas check)測試規則;CI 在 go test 之前執行 rcas check 和 rcas compile --all。

參考文獻:https://rulescascade.com/usage/go/

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能