diff --git a/lib/rouge/demos/rego b/lib/rouge/demos/rego new file mode 100644 index 0000000000..34b1422060 --- /dev/null +++ b/lib/rouge/demos/rego @@ -0,0 +1,8 @@ +package httpapi.authz + +subordinates = {"alice": [], "charlie": [], "bob": ["alice"], "betty": ["charlie"]} + +# HTTP API request +import input + +default allow = false diff --git a/lib/rouge/lexers/rego.rb b/lib/rouge/lexers/rego.rb new file mode 100644 index 0000000000..bd2f6e662f --- /dev/null +++ b/lib/rouge/lexers/rego.rb @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class Rego < RegexLexer + title "Rego" + desc "The Rego open-policy-agent (OPA) policy language (openpolicyagent.org)" + tag 'rego' + filenames '*.rego' + + state :basic do + rule %r/\s+/, Text + rule %r/#.*/, Comment::Single + + rule %r/[\[\](){}|.,;!]/, Punctuation + + rule %r/"[^"]*"/, Str::Double + + rule %r/-?\d+\.\d+([eE][+-]?\d+)?/, Num::Float + rule %r/-?\d+([eE][+-]?\d+)?/, Num + + rule %r/\\u[0-9a-fA-F]{4}/, Num::Hex + rule %r/\\["\/bfnrt]/, Str::Escape + end + + state :atoms do + rule %r/(true|false|null)/, Keyword::Constant + rule %r/[[:word:]]*/, Str::Symbol + end + + state :operators do + rule %r/(=|!=|>=|<=|>|<|\+|-|\*|%|\/|\||&|:=)/, Operator + rule %r/(default|not|package|import|as|with|else|some)/, Operator + rule %r/[\/:?@^~]+/, Operator + end + + state :root do + mixin :basic + mixin :operators + mixin :atoms + end + end + end +end diff --git a/spec/lexers/rego_spec.rb b/spec/lexers/rego_spec.rb new file mode 100644 index 0000000000..8e52e1302c --- /dev/null +++ b/spec/lexers/rego_spec.rb @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +describe Rouge::Lexers::Rego do + let(:subject) { Rouge::Lexers::Rego.new } + + describe 'guessing' do + include Support::Guessing + + it 'guesses by filename' do + assert_guess :filename => 'foo.rego' + end + end +end + \ No newline at end of file diff --git a/spec/visual/samples/rego b/spec/visual/samples/rego new file mode 100644 index 0000000000..549cf56c3d --- /dev/null +++ b/spec/visual/samples/rego @@ -0,0 +1,30 @@ +package httpapi.authz + +subordinates = {"alice": [], "charlie": [], "bob": ["alice"], "betty": ["charlie"]} + +# HTTP API request +import input +# input = { # example input +# "path": ["finance", "salary", "alice"], +# "user": "alice", +# "method": "GET" +# "version": 1 +# } + +default allow = false + +# Allow users to get their own salaries. +allow { + input.version = 1.0e1 + input.method = "GET" + input.path = ["finance", "salary", username] + input.user == username +} + +# Allow managers to get their subordinates' salaries. +allow { + input.version = 1.0 + input.method = "GET" + input.path = ["finance", "salary", username] + subordinates[input.user][_] == username +}