;; ========================================================================== ;; boundary-app.sx — Deployment-specific boundary declarations ;; ;; I/O primitives specific to THIS deployment's architecture: ;; inter-service communication, framework bindings, domain concepts, ;; and layout context providers. ;; ;; These are NOT part of the SX language contract — a different deployment ;; would declare different primitives here. ;; ;; The core SX I/O contract lives in boundary.sx. ;; Per-service page helpers live in {service}/sx/boundary.sx. ;; ========================================================================== ;; -------------------------------------------------------------------------- ;; Inter-service communication — microservice architecture ;; -------------------------------------------------------------------------- (define-io-primitive "frag" :params (service frag-type &key) :returns "string" :async true :doc "Fetch cross-service HTML fragment." :context :request) (define-io-primitive "query" :params (service query-name &key) :returns "any" :async true :doc "Fetch data from another service via internal HTTP." :context :request) (define-io-primitive "action" :params (service action-name &key) :returns "any" :async true :doc "Call an action on another service via internal HTTP." :context :request) (define-io-primitive "service" :params (service-or-method &rest args &key) :returns "any" :async true :doc "Call a domain service method. Two-arg: (service svc method). One-arg: (service method) uses bound handler service." :context :request) ;; -------------------------------------------------------------------------- ;; Framework bindings — Quart/Jinja2/HTMX specifics ;; -------------------------------------------------------------------------- (define-io-primitive "htmx-request?" :params () :returns "boolean" :async true :doc "True if current request has HX-Request header." :context :request) (define-io-primitive "g" :params (key) :returns "any" :async true :doc "Read a value from the Quart request-local g object." :context :request) (define-io-primitive "jinja-global" :params (key &rest default) :returns "any" :async false :doc "Read a Jinja environment global." :context :request) ;; -------------------------------------------------------------------------- ;; Domain concepts — navigation, relations ;; -------------------------------------------------------------------------- (define-io-primitive "nav-tree" :params () :returns "list" :async true :doc "Navigation tree as list of node dicts." :context :request) (define-io-primitive "get-children" :params (&key parent-type parent-id) :returns "list" :async true :doc "Fetch child entities for a parent." :context :request) (define-io-primitive "relations-from" :params (entity-type) :returns "list" :async false :doc "List of RelationDef dicts for an entity type." :context :config) ;; -------------------------------------------------------------------------- ;; Layout context providers — per-service header/page context ;; -------------------------------------------------------------------------- ;; Shared across all services (root layout) (define-io-primitive "root-header-ctx" :params () :returns "dict" :async true :doc "Dict with root header values (cart-mini, auth-menu, nav-tree, etc.)." :context :request) (define-io-primitive "select-colours" :params () :returns "string" :async true :doc "Shared select/hover CSS class string." :context :request) (define-io-primitive "account-nav-ctx" :params () :returns "any" :async true :doc "Account nav fragments, or nil." :context :request) (define-io-primitive "app-rights" :params () :returns "dict" :async true :doc "User rights dict from g.rights." :context :request) ;; Blog service layout (define-io-primitive "post-header-ctx" :params () :returns "dict" :async true :doc "Dict with post-level header values." :context :request) ;; Cart service layout (define-io-primitive "cart-page-ctx" :params () :returns "dict" :async true :doc "Dict with cart page header values." :context :request) ;; Events service layouts (define-io-primitive "events-calendar-ctx" :params () :returns "dict" :async true :doc "Dict with events calendar header values." :context :request) (define-io-primitive "events-day-ctx" :params () :returns "dict" :async true :doc "Dict with events day header values." :context :request) (define-io-primitive "events-entry-ctx" :params () :returns "dict" :async true :doc "Dict with events entry header values." :context :request) (define-io-primitive "events-slot-ctx" :params () :returns "dict" :async true :doc "Dict with events slot header values." :context :request) (define-io-primitive "events-ticket-type-ctx" :params () :returns "dict" :async true :doc "Dict with ticket type header values." :context :request) ;; Market service layout (define-io-primitive "market-header-ctx" :params () :returns "dict" :async true :doc "Dict with market header data." :context :request) ;; Federation service layout (define-io-primitive "federation-actor-ctx" :params () :returns "dict?" :async true :doc "Serialized ActivityPub actor dict or nil." :context :request)