summaryrefslogtreecommitdiff
path: root/community-garden
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2022-12-15 16:28:46 -0500
committerDavid Thompson <dthompson2@worcester.edu>2023-01-06 16:00:25 -0500
commitc8f1428436aab348c42e2f8d568d18873b785f52 (patch)
tree924d2870b8575997341548bafd541fe055d8b2fb /community-garden
parent03944a1765fcfc26dc11f25e659fbb7a2c1a03fa (diff)
Attempt an ocapn integration that doesn't quite work.
Diffstat (limited to 'community-garden')
-rw-r--r--community-garden/actors.scm29
-rw-r--r--community-garden/edit.scm38
2 files changed, 60 insertions, 7 deletions
diff --git a/community-garden/actors.scm b/community-garden/actors.scm
index b34d1f8..f0b3240 100644
--- a/community-garden/actors.scm
+++ b/community-garden/actors.scm
@@ -1,7 +1,10 @@
(define-module (community-garden actors)
#:use-module (community-garden garden-bed)
+ #:use-module (community-garden plant)
#:use-module (goblins)
+ #:use-module (goblins actor-lib cell)
#:use-module (goblins actor-lib methods)
+ #:use-module (goblins actor-lib sealers)
#:use-module (goblins utils simple-sealers)
#:export (^botanist
^garden-gate
@@ -9,36 +12,48 @@
^visitor
^gardener))
-(define (^botanist bcom)
+(define* (^botanist _bcom)
+ (define registry (spawn ^cell '()))
(define-values (seal-plant unseal-plant approved-plant?)
- (make-sealer-triplet))
+ (spawn-sealer-triplet))
(methods
((approve-plant plant)
- (seal-plant plant))
+ (let ((sealed-plant ($ seal-plant plant)))
+ ($ registry (cons sealed-plant ($ registry)))
+ sealed-plant))
((check-plant plant)
- (if (approved-plant? plant)
- (unseal-plant plant)
- (error "plant is not allowed" plant)))))
+ (if ($ approved-plant? plant)
+ ($ unseal-plant plant)
+ (error "plant is not allowed" plant)))
+ ((approved-plants)
+ ($ registry))))
(define (^garden-gate bcom botanist)
(methods
((check-plant plant)
- ($ botanist 'check-plant plant))))
+ ($ botanist 'check-plant plant))
+ ((approved-plants)
+ ($ botanist 'approved-plants))))
(define (^garden bcom name garden-bed garden-gate)
(define (ensure-empty x y)
(when (garden-bed-ref garden-bed x y)
+ (format #t "tried to plant in occupied tile (~a, ~a)\n" x y)
(error "tile already has something planted in it" x y)))
(methods
((get-name) name)
((get-bed) garden-bed)
+ ((get-approved-plants)
+ ($ garden-gate 'approved-plants))
((plant x y sealed-plant)
(ensure-empty x y)
(let* ((plant ($ garden-gate 'check-plant sealed-plant))
(new-bed (garden-bed-set garden-bed x y plant)))
+ (format #t "planted ~a in tile (~a, ~a)\n" (plant-name plant) x y)
(bcom (^garden bcom name new-bed garden-gate))))
((dig-up x y)
(let ((new-bed (garden-bed-set garden-bed x y #f)))
+ (format #t "dug up tile (~a, ~a)\n" x y)
(bcom (^garden bcom name new-bed garden-gate))))))
(define (^visitor bcom name garden)
diff --git a/community-garden/edit.scm b/community-garden/edit.scm
new file mode 100644
index 0000000..9e56f87
--- /dev/null
+++ b/community-garden/edit.scm
@@ -0,0 +1,38 @@
+(define-module (community-garden edit)
+ #:use-module (community-garden actors)
+ #:use-module (goblins)
+ #:use-module (goblins vrun)
+ #:use-module (goblins ocapn ids)
+ #:use-module (goblins ocapn captp)
+ #:use-module (goblins ocapn netlayer onion)
+ #:use-module (ice-9 match)
+ #:export (edit-garden))
+
+(define (edit-garden name garden-address)
+ (define garden-sref (string->ocapn-id garden-address))
+ (define vat (spawn-vat))
+ (define-vat-run vat-run vat)
+ (define onion-netlayer (vat-run (new-onion-netlayer)))
+ (define mycapn (vat-run (spawn-mycapn onion-netlayer)))
+ (define garden-vow (vat-run ($ mycapn 'enliven garden-sref)))
+ (define approved-plants-vow (vat-run (<- garden-vow 'get-approved-plants)))
+ (define gardener (vat-run (spawn ^gardener name garden-vow)))
+ (define running? #t)
+ (while running?
+ (match (read)
+ (('quit)
+ (set! running? #f))
+ (('get-garden-name)
+ (vat-run (on ($ gardener 'get-garden-name)
+ (lambda (name)
+ (format #t "~a\n" name)))))
+ (('dig-up x y)
+ (vat-run ($ gardener 'dig-up x y)))
+ (('plant x y)
+ (vat-run
+ (on approved-plants-vow
+ (match-lambda
+ ((plant . _)
+ ($ gardener 'plant plant x y))))))
+ (exp
+ (format #t "unrecognized command: ~a\n" exp)))))