polix.policy

Policy definition, management, and analysis.

Provides the defpolicy macro for defining declarative policies, the Policy record for representing compiled policies, and analysis functions for extracting parameter requirements and document paths.

Analysis Example

(require '[polix.policy :as policy])

;; Analyze a policy's requirements
(policy/analyze-policy [:and [:= :doc/role :param/role]
                             [:> :doc/level :param/min]])
;; => {:params #{:role :min}
;;     :doc-keys #{[:role] [:level]}
;;     :parameterized? true}

analyze-policy

(analyze-policy policy)(analyze-policy policy _registry)

Analyzes a policy to determine its requirements and characteristics.

Takes a policy expression or AST. Returns a map with:

  • :params — set of required parameter keys
  • :doc-keys — set of document paths accessed
  • :parameterized? — true if policy requires any params

This analysis operates on the policy structure alone without resolving policy references. For full analysis including referenced policies, pass a registry to the 2-arity version.

(analyze-policy [:= :doc/role :param/role])
;=> {:params #{:role}
;    :doc-keys #{[:role]}
;    :parameterized? true}

(analyze-policy [:and [:= :doc/role "admin"]
                      [:> :doc/level 5]])
;=> {:params #{}
;    :doc-keys #{[:role] [:level]}
;    :parameterized? false}

defpolicy

macro

(defpolicy name & args)

Defines a policy with a name, optional docstring, and policy expression.

A policy is a declarative rule that evaluates to boolean true/false. The macro parses the policy expression into an AST and extracts the required document schema.

Examples:

(defpolicy MyPolicy
  "Optional docstring"
  [:= :doc/actor-role "admin"])

(defpolicy AnotherPolicy
  [:or [:= :doc/role "admin"]
       [:= :doc/role "user"]])

Returns a def form that creates a Policy record, or throws on parse error.

required-params

(required-params policy)(required-params policy registry)

Returns the set of required parameter keys for a policy.

Convenience function that calls analyze-policy and extracts :params.

(required-params [:= :doc/role :param/role])
;=> #{:role}

(required-params [:= :doc/role "admin"])
;=> #{}