diff --git a/private/compile.rkt b/private/compile.rkt index 1361d40..c6d72d7 100644 --- a/private/compile.rkt +++ b/private/compile.rkt @@ -2,8 +2,15 @@ ;; compiler +(provide (struct-out rule) + generate-operations + execute-rule) + +;; A compiler rule +;; Input files, output file, compile function (struct rule [inputs output compiler] #:transparent) +;; Converts set of rules into ordered list of rules to execute based on current filesystem state (define (generate-operations rules) (define nodes (mutable-set)) (define edges (make-hash)) @@ -92,10 +99,19 @@ (error "self-check failed lmao")) dirty-sorted) - -(define compiler-rules - (set - (rule '("test.o") "my_binary" void) - (rule '("test.c") "test.o" void))) - -(generate-operations compiler-rules) +;; Executes one rule +(define (execute-rule r) + (match-define (rule in out func) r) + (define cust (make-custodian)) + (parameterize ([current-custodian cust]) + (thread-wait + (thread + (lambda () + (call-with-atomic-output-file + out + (lambda (out-port tmp-path) + (func + (for/hash ([fn (in-list in)]) + (values fn (open-input-file fn))) + out-port))))))) + (custodian-shutdown-all cust)) diff --git a/private/rules.rkt b/private/rules.rkt new file mode 100644 index 0000000..303505c --- /dev/null +++ b/private/rules.rkt @@ -0,0 +1,65 @@ +#lang racket + +;; static generation rules + +(require json + "compile.rkt") + +(define ACTOR-CONTEXT + (list "https://www.w3.org/ns/activitystreams" + "https://w3id.org/security/v1" + (hash 'manuallyApprovesFollowers "as:manuallyApprovesFollowers" + 'sensitive "as:sensitive" + 'movedTo "as:movedTo" + 'Hashtag "as:Hashtag" + 'toot "http://joinmastodon.org/ns#" + 'Emoji "toot:Emoji" + 'focalPoint (hash '@container "@list" + '@id "toot:focalPoint") + 'featured "toot:featured"))) + +(define compile-index-json + (rule '("db/actorkey.pub") "public/index.json" + (lambda (in out) + (define key (port->string (hash-ref in "db/actorkey.pub"))) + (define actor (hash + '@context ACTOR-CONTEXT + 'Type "Person" + 'id "https://example.tld/" + 'name "haskal" + 'preferredUsername "haskal" + 'icon (hash 'type "Image" + 'url "something" + 'sensitive #f) + 'image (hash 'type "Image" + 'url "something" + 'sensitive #f) + 'tag (list (hash 'type "Hashtag" + 'href "https://example.tld/tags/blahaj" + 'name "#blahaj")) + 'manuallyApprovesFollowers #f + 'summary "summary lol" + 'attachment (list (hash 'type "PropertyValue" + 'name "pronouns" + 'value "they/them")) + 'url "https://example.tld/" + 'inbox "https://example.tld/inbox" + 'sharedInbox "https://example.tld/inbox" + 'endpoints (hash 'sharedInbox "https://example.tld/inbox") + 'outbox "https://example.tld/outbox" + 'following 'null + 'followers "https://example.tld/followers" + 'liked 'null + 'publicKey (hash 'id "https://example.tld/#main-key" + 'type "Key" + 'owner "https://example.tld/" + 'publicKeyPem key))) + (write-json actor out)))) + +(define compiler-rules + (set compile-index-json)) + +(define ops (generate-operations compiler-rules)) +(for ([op (in-list ops)]) + (printf "executing ~s\n" op) + (execute-rule op))