目次
- 第1章: Regoとは何か
- 第2章: 基本構文とデータ構造
- 第3章: ルールの種類と書き方
- 第4章: 制御構造と演算子
- 第5章: 内包表記とデータ操作
- 第6章: 組み込み関数
- 第7章: テストとデバッグ
第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 - 動的データ
data - 静的データ
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)
単一の値を返すルール。
評価順序: 複数のルールがマッチした場合、最後に定義されたルールの値が採用される。
3.3 セットルール(Partial Set Rules)
セット(集合)を生成するルール。
3.4 オブジェクトルール(Partial Object Rules)
オブジェクト(マップ)を生成するルール。
第4章: 制御構造と演算子
4.1 比較演算子
| 演算子 | 説明 | 例 |
|---|---|---|
== |
等しい | input.role == "admin" |
!= |
異なる | input.status != "banned" |
< |
小なり | input.age < 65 |
<= |
以下 | input.score <= 100 |
> |
大なり | input.salary > 50000 |
>= |
以上 | input.age >= 18 |
4.2 論理演算子
AND(論理積)
OR(論理和)
NOT(否定)
4.3 量化(Quantification)
some - 存在量化
「少なくとも1つが条件を満たす」場合にtrue。
every - 全称量化
「すべてが条件を満たす」場合にtrue。
4.4 in演算子
第5章: 内包表記とデータ操作
5.1 内包表記の種類
内包表記は既存のデータから新しいコレクションを生成する構文である。
| 種類 | 構文 | 特徴 | 用途 |
|---|---|---|---|
| 配列内包 | [term | body] |
順序あり、重複可能 | リスト処理 |
| セット内包 | {term | body} |
順序なし、重複除去 | ユニークな値の集合 |
| オブジェクト内包 | {key: value | body} |
キー・値のペア | 構造化データの変換 |
5.2 配列内包
5.3 セット内包
5.4 オブジェクト内包
5.5 ネストした内包表記
第6章: 組み込み関数
Regoには豊富な組み込み関数が用意されている。実行環境(Go SDK、WebAssembly等)によって利用可能な関数が異なるため、詳細は公式リファレンスを参照すること。
- Built-in Functions リファレンス
- 全ての組み込み関数の詳細仕様
- 実行環境別の対応状況(Wasm / SDK-dependent)
- 使用例とパラメータ説明
第7章: テストとデバッグ
7.1 テストの基本
Regoのテストはtest_で始まる名前の関数として記述する。
基本的なテスト構文
7.2 with文による値の差し替え
withキーワードを使用して、テスト時にinputやdataを差し替えできる。