Rego入門

目次

第1章: Regoとは何か

1.1 Regoの思想・特徴

Regoは宣言型のポリシー記述言語である。「どのように処理するか」ではなく、「何を満たすべきか」を記述する。

命令型 vs 宣言型の比較

命令型(Go, JavaScript等) 宣言型(Rego)
for文でループして条件判定 some i; input.groups[i] == "admin"
if/else による分岐処理 複数のルールによる条件記述
手続き的な実行フロー 条件の成立/不成立の判定

入力(input)とデータ(data)の分離

Regoは2種類のデータを扱う:

種類 説明
input 評価時に与えられる動的データ リクエスト内容
data 参照用の静的・共有データ ユーザー情報、ロール定義

この分離により、ポリシーが汎用的で再利用可能になる。

1.2 ルールベース評価モデル

Regoの基本単位はルールである:

  • 複数のルールが評価され、条件を満たす場合はtrue
  • 明示的なdefaultがない場合、マッチしない場合はundefined(結果として評価されない)
  • 意思決定の記述:「許可するか?」「どのフィールドが見えるか?」

第2章: 基本構文とデータ構造

2.1 基本構文要素

Package文

Import文

コメント

2.2 データ型

データ型 説明
文字列 "admin", "user" ダブルクォート
数値 42, 3.14 整数・浮動小数点
ブール値 true, false 真偽値
配列 [1, 2, 3] 順序あり
オブジェクト {"name": "Alice", "age": 30} キー・値のペア
セット {"admin", "user"} 重複なし

2.3 input と data

input - 動的データ

Playground で試す

data - 静的データ

Playground で試す

Dataセクションに貼り付けるJSON:

第3章: ルールの種類と書き方

3.1 ルール構文パターン

Regoのルールには複数のパターンがある:

パターン 構文例 結果の型 説明
<name> := <value> pi := 3.14 単一値 完全ルール
<name> if <body> valid if input.age >= 18 boolean 条件付き完全ルール
<name> contains <key> if <body> users contains name if ... セット セットルール
<name>[<key>] := <value> if <body> scores[user] := score if ... オブジェクト オブジェクトルール

3.2 単一値ルール(Complete Rules)

単一の値を返すルール。

Playground で試す

評価順序: 複数のルールがマッチした場合、最後に定義されたルールの値が採用される。

3.3 セットルール(Partial Set Rules)

セット(集合)を生成するルール。

Playground で試す

3.4 オブジェクトルール(Partial Object Rules)

オブジェクト(マップ)を生成するルール。

Playground で試す

第4章: 制御構造と演算子

4.1 比較演算子

演算子 説明
== 等しい input.role == "admin"
!= 異なる input.status != "banned"
< 小なり input.age < 65
<= 以下 input.score <= 100
> 大なり input.salary > 50000
>= 以上 input.age >= 18

4.2 論理演算子

AND(論理積)

Playground で試す

OR(論理和)

Playground で試す

NOT(否定)

Playground で試す

4.3 量化(Quantification)

some - 存在量化

「少なくとも1つが条件を満たす」場合にtrue。

Playground で試す

every - 全称量化

「すべてが条件を満たす」場合にtrue。

Playground で試す

4.4 in演算子

Playground で試す

第5章: 内包表記とデータ操作

5.1 内包表記の種類

内包表記は既存のデータから新しいコレクションを生成する構文である。

種類 構文 特徴 用途
配列内包 [term | body] 順序あり、重複可能 リスト処理
セット内包 {term | body} 順序なし、重複除去 ユニークな値の集合
オブジェクト内包 {key: value | body} キー・値のペア 構造化データの変換

5.2 配列内包

Playground で試す

5.3 セット内包

Playground で試す

5.4 オブジェクト内包

Playground で試す

5.5 ネストした内包表記

Playground で試す


第6章: 組み込み関数

Regoには豊富な組み込み関数が用意されている。実行環境(Go SDK、WebAssembly等)によって利用可能な関数が異なるため、詳細は公式リファレンスを参照すること。

第7章: テストとデバッグ

7.1 テストの基本

Regoのテストはtest_で始まる名前の関数として記述する。

基本的なテスト構文

Playground で試す

7.2 with文による値の差し替え

withキーワードを使用して、テスト時にinputdataを差し替えできる。

Playground で試す

7.3 テストケースの網羅

7.4 デバッグ手法

print文によるデバッグ

trace関数(より詳細な出力)

7.5 テストの実行

参考資料