Communityコーディング&開発github.com

YarlisAISolutions/rules-cascade-go

Goサービスやツール(net/http、chi、gin、echo、gRPC、ワーカー)でRule Cascadeルールを適用します。ルールをGoコードパスに組み込む際、バリデーションタグや手書きのチェックをエンジンに置き換える際、ルールの判定結果をHTTPやgRPCエラーにマッピングする際に使用します。

rules-cascade-go とは?

Rule Cascade for Goは、Goのサービスやツール(net/http、chi、gin、echo、gRPC、バックグラウンドワーカー)にビジネスルールエンジンを統合するためのスキルです。Go 1.26+で利用可能で、標準ライブラリと`gopkg.in/yaml.v3`以外の依存関係はありません。ルールは`rcas compile --all`で事前にコンパイルされ、ビルド時に`build/rules/`配下にバンドルされます。これにより、実行時にYAMLを評価したり、ルールをコードにコピーする必要がなくなります。 スキルはミドルウェアベースの統合を推奨しており、`rulescascade.com/go/rulehttp`パッケージを使用すると、HTTPリクエストのJSONボディからリクエストを構築し、ルールを適用し、拒否されたリクエストに対して統一された422問題詳細を返します。gRPCの場合は`codes.FailedPrecondition`を返します。また、`rules.Enforce()`と`rules.Evaluate()`の両方のAPIが提供されており、前者は単一のエラーを返し、後者は詳細な結果オブジェクトを提供します。`*RuleSet`は複数のgoroutineから安全に使用できます。 既存のバリデーションからの移行には、`rcas analyze --module <module>`コマンドを使用して`validate:`や`binding:`の構造タグ、ozzo-validation、手書きのチェックなどを検出し、ビジネスロジックの段階的な移行を支援します。テーブル駆動テストとゴールデンテストを使用したテスト戦略も推奨されており、信頼性の高いルール適用が可能です。

対応~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に質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

GoにおけるRule Cascade

モジュール: go get rulescascade.com/go (Go 1.26+、標準ライブラリとgopkg.in/yaml.v3以外の依存関係はありません)。バンドルは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は並行アクセスに対して安全です。すべての状態変更ハンドラは以下の4つのステップに従います。

  1. サーバー上で評価 map[string]any{"entity", "operation", "data", "original", "actor", "resolutions"}を使用します。actorは認証ミドルウェアから取得し、呼び出し元が制御するヘッダーからは決して取得しません。リクエストボディは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ごとに1回実行します(アウトボックステーブル、または重複排除機能付きブローカー)。

配置: エンティティごとに1つの関数がリクエストを構築して評価し、すべてのハンドラ(net/http、chi、gin、echoはすべて同じ)から呼び出されます。rulecascade.NewHolderは間隔またはcronスケジュールでバンドルを再読み込みし、最後に有効だったルールを保持します。

既存のバリデーションの置き換え

rcas analyze --module <module>はvalidate:とbinding:の構造タグ、ozzo-validation、ルールエンジン、手書きのerrors.Newチェック、名前付きリミット(const MaxQuantity = 10)、数値との比較、switch分岐をリストアップします。driftのある候補は、プロジェクトの別の言語(多くの場合フロントエンド)が同じ名前に対して別の値を決定していることを意味します。つまり、1つのルールセットが両方に対して決定する必要があります。シェイプチェックはデコードに残し、ビジネス上の決定はルールに移します。古いチェックとエンジンに対して同じ入力でテーブル駆動のパリティテストを追加し、その後古いチェックを削除します。

テスト

DecisionとfindingのCodeに対するテーブル駆動テスト(メッセージテキストは対象外)。ルールセット内のゴールデンテスト(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.

関連スキル