Skip to content

Investigate highlighting Precept syntax directly #26

Description

@alex-dixon

Somewhat related to #13.

The problems:

  1. the entities macro and defsub expand to multiple rules. For a subscription rule this means we show something like the following:

Conditions:

[[?54076 :precept.spec.rulegen/for-rule (= task-list-sub___impl (:v this))]]
[[?54076 :precept.spec.rulegen/for-macro (= :precept.spec.rulegen/entities (:v this))]]
[[?54076 :precept.spec.rulegen/request-params ?eids]]
[[?54076 :precept.spec.rulegen/response ?visible-todos]]
[[_ :active-count ?active-count]]

Matches:

[8b4f0908 :precept.spec.rulegen/for-rule {:name todomvc.rules/task-list-sub___impl,
 :ns-name todomvc.rules,
 :lhs [{:constraints [(= ?e___sub___impl (:e this))
                      (= :task-list (:v this))],
        :type :precept.spec.sub/request}
       {:constraints [(= ?54076 (:e this))
                      (= task-list-sub___impl (:v this))],
        :type :precept.spec.rulegen/for-rule}
       {:constraints [(= ?54076 (:e this))
                      (= :precept.spec.rulegen/entities
                       (:v this))],
        :type :precept.spec.rulegen/for-macro}
       {:constraints [(= ?54076 (:e this)) (= ?eids (:v this))],
        :type :precept.spec.rulegen/request-params}
       {:constraints [(= ?54076 (:e this))
                      (= ?visible-todos (:v this))],
        :type :precept.spec.rulegen/response}
       {:constraints [(= ?active-count (:v this))],
        :type :active-count}],
 :rhs (do (do (do (precept.util/insert!
                   [?e___sub___impl :precept.spec.sub/response
                    {:visible-todos ?visible-todos,
                     :all-complete? (= 0 ?active-count)}])))),
 :props {:group :report}}]
[8b4f0908 :precept.spec.rulegen/for-macro :precept.spec.rulegen/entities]
[8b4f0908 :precept.spec.rulegen/request-params (#uuid "1d539fb5-3a69-43f3-a972-f0a7714adf64"
 #uuid "7884fcda-95fe-4c3d-b75d-294f0bfaa4c4")]
[8b4f0908 :precept.spec.rulegen/response ([[1d539fb5 :todo/title Hi] [1d539fb5 :todo/done false]
  [1d539fb5 :todo/visible true]]
 [[7884fcda :todo/title there!] [7884fcda :todo/done false]
  [7884fcda :todo/visible true]])]
[:global :active-count 2]

Consequence:

{:visible-todos ([[1d539fb5 :todo/title Hi] [1d539fb5 :todo/done false]
  [1d539fb5 :todo/visible true]]
 [[7884fcda :todo/title there!] [7884fcda :todo/done false]
  [7884fcda :todo/visible true]]):all-complete? false}

We show this in the rules view, which is the literal syntax the user wrote (it comes from a different source than the condtition/match/consequence parsing code):

;; task-list-sub___impl___impl_split-0
(defsub :task-list
[?eids <- (acc/by-fact-id :e) :from
[:todo/visible]]
[(<- ?visible-todos (entities ?eids))]
[[_ :active-count ?active-count]]
=>
{:visible-todos ?visible-todos, :all-complete? (= 0 ?active-count)})

This is a pretty complex example, because entities is being used in defsub, hence sub-__impl (rewrites the sub with :sub-request/task-list for its first condition) and __impl_split-0 (defines two new rules -- a generated one that inserts, and a rewritten original that has conditions that match on the result of it).

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions