diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..5bd4399 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,3 @@ +Contributors to Bugafriend 0.1: + + Vivi Langdon diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..76c33bf --- /dev/null +++ b/ChangeLog @@ -0,0 +1 @@ +For a complete log, please see the Git commit log at . diff --git a/HACKING b/HACKING index 1ba54e7..786147f 100644 --- a/HACKING +++ b/HACKING @@ -9,13 +9,20 @@ By far the easiest way to hack on bugafriend is to develop using Guix: #+BEGIN_SRC bash # Obtain the source code cd /path/to/source-code - guix environment -l guix.scm + guix shell -Df guix.scm # In the new shell, run: - hall dist --execute && autoreconf -vif && ./configure && make check + hall build --execute && autoreconf -vif && ./configure && make check +#+END_SRC + +You may also want to set your directory as an authorized directory for +`guix shell' so it works without arguments. To do that, simply run + +#+BEGIN_SRC bash + echo $(pwd) >> $HOME/.config/guix/shell-authorized-directories #+END_SRC You can now hack this project's files to your heart's content, whilst -testing them from your `guix environment' shell. +testing them from your `guix shell' shell. To try out any scripts in the project you can now use @@ -43,5 +50,5 @@ dependencies manually: Once those dependencies are installed you can run: #+BEGIN_SRC bash - hall dist -x && autoreconf -vif && ./configure && make check + hall build -x && autoreconf -vif && ./configure && make check #+END_SRC diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..b8604eb --- /dev/null +++ b/Makefile.am @@ -0,0 +1,93 @@ +bin_SCRIPTS = scripts/listen \ + scripts/say \ + scripts/listen + +nodist_noinst_SCRIPTS = pre-inst-env + +GOBJECTS = $(SOURCES:%.scm=%.go) + +moddir=$(prefix)/share/guile/site/$(GUILE_EFFECTIVE_VERSION) +godir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache +ccachedir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache + +nobase_dist_mod_DATA = $(SOURCES) $(NOCOMP_SOURCES) +nobase_go_DATA = $(GOBJECTS) + +# Make sure source files are installed first, so that the mtime of +# installed compiled files is greater than that of installed source +# files. See +# +# for details. +guile_install_go_files = install-nobase_goDATA +$(guile_install_go_files): install-nobase_dist_modDATA + +GUILE_WARNINGS = -Wunbound-variable -Warity-mismatch -Wformat +SUFFIXES = .scm .go +.scm.go: + $(AM_V_GEN)$(top_builddir)/pre-inst-env $(GUILE_TOOLS) compile $(GUILE_TARGET) $(GUILE_WARNINGS) -o "$@" "$<" + +SOURCES = bugafriend.scm \ + bugafriend/utils/registry.go \ + bugafriend/utils/registry.scm \ + bugafriend/hconfig.scm \ + bugafriend/hconfig.go \ + bugafriend/listener.go \ + bugafriend/listener.scm \ + bugafriend/ui.go \ + bugafriend/ui.scm + +TESTS = + +TEST_EXTENSIONS = .scm +SCM_LOG_DRIVER = \ + $(top_builddir)/pre-inst-env \ + $(GUILE) --no-auto-compile -e main \ + $(top_srcdir)/build-aux/test-driver.scm + +# Tell 'build-aux/test-driver.scm' to display only source file names, +# not indivdual test names. +AM_SCM_LOG_DRIVER_FLAGS = --brief=yes + +AM_SCM_LOG_FLAGS = --no-auto-compile -L "$(top_srcdir)" + +AM_TESTS_ENVIRONMENT = abs_top_srcdir="$(abs_top_srcdir)" + +info_TEXINFOS = doc/version.texi \ + doc/bugafriend.texi + +EXTRA_DIST = README.org \ + README \ + HACKING \ + COPYING \ + doc/.dirstamp \ + doc/stamp-vti \ + doc/bugafriend.info \ + NEWS \ + AUTHORS \ + ChangeLog \ + guix.scm \ + .gitignore \ + hall.scm \ + build-aux/texinfo.tex \ + build-aux/test-driver.scm \ + build-aux/missing \ + build-aux/install-sh \ + build-aux/mdate-sh \ + configure.ac \ + Makefile.am \ + pre-inst-env.in \ + build-aux/test-driver.scm \ + $(TESTS) + +ACLOCAL_AMFLAGS = -I m4 + +AM_DISTCHECK_DVI_TARGET = info # Disable DVI as part of distcheck + +clean-go: + -$(RM) $(GOBJECTS) +.PHONY: clean-go + +CLEANFILES = \ + $(BUILT_SOURCES) \ + $(GOBJECTS) \ + $(TESTS:tests/%.scm=%.log) diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..acbda66 --- /dev/null +++ b/NEWS @@ -0,0 +1,14 @@ +# -*- mode: org; coding: utf-8; -*- + +#+TITLE: Bugafriend NEWS – history of user-visible changes +#+STARTUP: content hidestars + +Copyright © (2024) Vivi Langdon + + Copying and distribution of this file, with or without modification, + are permitted in any medium without royalty provided the copyright + notice and this notice are preserved. + +Please send Bugafriend bug reports to puttabutta@gmail.com. + +* Publication at 0.1 diff --git a/bugafriend/hconfig.scm b/bugafriend/hconfig.scm new file mode 100644 index 0000000..f958f4f --- /dev/null +++ b/bugafriend/hconfig.scm @@ -0,0 +1,35 @@ +(define-module + (bugafriend hconfig) + #:use-module + (srfi srfi-26) + #:export + (%version + %author + %license + %copyright + %gettext-domain + G_ + N_ + init-nls + init-locale)) + +(define %version "0.1") + +(define %author "Vivi Langdon") + +(define %license 'gpl3+) + +(define %copyright '(2024)) + +(define %gettext-domain "bugafriend") + +(define G_ identity) + +(define N_ identity) + +(define (init-nls) "Dummy as no NLS is used" #t) + +(define (init-locale) + "Dummy as no NLS is used" + #t) + diff --git a/bugafriend/listener.scm b/bugafriend/listener.scm new file mode 100644 index 0000000..9769ba6 --- /dev/null +++ b/bugafriend/listener.scm @@ -0,0 +1,16 @@ +(define-module (bugafriend listener) + #:use-module (bugafriend utils registry) + #:use-module (goblins) + #:use-module (goblins ocapn ids) + #:export (listen)) + +;; Code for the listener +(define (^listener bcom) + (lambda (text) (format #t "~a\n" text))) + +(define (listen setup-sref) +(on (prelay-sref->mycapn-registry setup-sref) + (lambda (registry) + (define listener (spawn ^listener)) + (define listener-id ($ registry 'register listener)) + (format #t "Listener registered at ~s\n" (ocapn-id->string listener-id))))) diff --git a/bugafriend/ui.scm b/bugafriend/ui.scm new file mode 100644 index 0000000..7e763aa --- /dev/null +++ b/bugafriend/ui.scm @@ -0,0 +1,75 @@ +(define-module (bugafriend ui) + #:use-module (goblins) + #:use-module (goblins vat) + #:use-module (bugafriend utils registry) + #:use-module (goblins ocapn ids) + #:use-module (ice-9 rdelim) + #:use-module (ice-9 suspendable-ports) + #:use-module (fibers) + #:use-module (fibers channels) + #:use-module (fibers conditions) + #:use-module (ice-9 match) + #:export (say)) + +;; https://www.gnu.org/software/guile/manual/guile.html#Non_002dBlocking-I_002fO +(let* ((input (current-input-port)) + (flags (fcntl input F_GETFL))) + (fcntl input F_SETFL (logior O_NONBLOCK flags))) +(install-suspendable-ports!) + +(define echo-vat + (spawn-vat #:name "echo-vat")) +;; Code for the speaker +(define (%prompt) (format #t "say > ")) + +(define registry #f) + +(define listener #f) +(define listener-set? (make-condition)) + +(define (%eval-command cmd) + (match cmd + (("quit") #f) ;; Returns false so we quit the loop + (("join" listener-id) + (define listener-sref (string->ocapn-id listener-id)) + (on (<- registry 'enliven listener-sref) + (lambda (l) + (set! listener l) + (signal-condition! listener-set?)))) + (else + (format #t "Don't know how to handle ~a.\n" cmd) + #t))) + +(define (%eval-loop) + ((%prompt) + (let* ((line (read-line (current-input-port))) + (first-char (string-ref line 0))) + (when (eq? first-char #\/) (%eval-command (substring line 1)))))) + +(define (%loop) + (%prompt) + (let* ((line (read-line (current-input-port))) + (first-char (string-ref line 0))) + (cond + ((eq? first-char #\/) (%eval-command (substring line 1))) + (else + (with-vat echo-vat + (<- listener line) + #t))))) + +(define (say setup-sref) + (define registry-set? (make-condition)) + (format #t "Hello?") + (syscaller-free-fiber + (lambda () + (format #t "Is it me you're looking for") + (with-vat echo-vat + (on (prelay-sref->mycapn-registry setup-sref) + (lambda (r) + (set! registry r) + (signal-condition! registry-set?)))) + (while (%eval-loop)) + (wait registry-set?) + (wait listener-set?) + (while (%loop)) + (format #t "Bye!\n")))) diff --git a/bugafriend/utils/registry.scm b/bugafriend/utils/registry.scm new file mode 100644 index 0000000..a40edb6 --- /dev/null +++ b/bugafriend/utils/registry.scm @@ -0,0 +1,24 @@ +(define-module (bugafriend utils registry) + #:use-module (goblins) + #:use-module (goblins actor-lib methods) + #:use-module (goblins ocapn captp) + #:use-module (goblins ocapn netlayer prelay) + #:use-module (goblins ocapn netlayer prelay-utils) + #:use-module (ice-9 match) + #:export (prelay-sref->mycapn-registry)) + +;; Proposal for a registry object that bundles up a netlayer and mycapn into a single two-method capability +;; See https://community.spritely.institute/t/feedback-on-ocapn-netlayers-interface/407 +(define (^mycapn-registry bcom netlayer netlayer-type) + (define mycapn (spawn-mycapn netlayer)) + (methods + [(register obj) + ($ mycapn 'register obj netlayer-type)] + [(enliven id) + ($ mycapn 'enliven id)])) + +(define (prelay-sref->mycapn-registry setup-sref) + (on (fetch-and-spawn-prelay-netlayer setup-sref) + (lambda (netlayer) + (spawn ^mycapn-registry netlayer 'prelay)) + #:promise? #t)) diff --git a/build-aux/test-driver.scm b/build-aux/test-driver.scm new file mode 100644 index 0000000..0c555ea --- /dev/null +++ b/build-aux/test-driver.scm @@ -0,0 +1,179 @@ +;;;; test-driver.scm - Guile test driver for Automake testsuite harness + +(define script-version "2019-01-15.13") ;UTC + +;;; Copyright © 2015, 2016 Mathieu Lirzin +;;; Copyright © 2019 Alex Sassmannshausen +;;; +;;; This program is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see . + +;;;; Commentary: +;;; +;;; This script provides a Guile test driver using the SRFI-64 Scheme API for +;;; test suites. SRFI-64 is distributed with Guile since version 2.0.9. +;;; +;;; This script is a lightly modified version of the orignal written by +;;; Matthieu Lirzin. The changes make it suitable for use as part of the +;;; guile-hall infrastructure. +;;; +;;;; Code: + +(use-modules (ice-9 getopt-long) + (ice-9 pretty-print) + (srfi srfi-26) + (srfi srfi-64)) + +(define (show-help) + (display "Usage: + test-driver --test-name=NAME --log-file=PATH --trs-file=PATH + [--expect-failure={yes|no}] [--color-tests={yes|no}] + [--enable-hard-errors={yes|no}] [--brief={yes|no}}] [--] + TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS] +The '--test-name', '--log-file' and '--trs-file' options are mandatory. +")) + +(define %options + '((test-name (value #t)) + (log-file (value #t)) + (trs-file (value #t)) + (color-tests (value #t)) + (expect-failure (value #t)) ;XXX: not implemented yet + (enable-hard-errors (value #t)) ;not implemented in SRFI-64 + (brief (value #t)) + (help (single-char #\h) (value #f)) + (version (single-char #\V) (value #f)))) + +(define (option->boolean options key) + "Return #t if the value associated with KEY in OPTIONS is 'yes'." + (and=> (option-ref options key #f) (cut string=? <> "yes"))) + +(define* (test-display field value #:optional (port (current-output-port)) + #:key pretty?) + "Display 'FIELD: VALUE\n' on PORT." + (if pretty? + (begin + (format port "~A:~%" field) + (pretty-print value port #:per-line-prefix "+ ")) + (format port "~A: ~S~%" field value))) + +(define* (result->string symbol #:key colorize?) + "Return SYMBOL as an upper case string. Use colors when COLORIZE is #t." + (let ((result (string-upcase (symbol->string symbol)))) + (if colorize? + (string-append (case symbol + ((pass) "") ;green + ((xfail) "") ;light green + ((skip) "") ;blue + ((fail xpass) "") ;red + ((error) "")) ;magenta + result + "") ;no color + result))) + +(define* (test-runner-gnu test-name #:key color? brief? out-port trs-port) + "Return an custom SRFI-64 test runner. TEST-NAME is a string specifying the +file name of the current the test. COLOR? specifies whether to use colors, +and BRIEF?, well, you know. OUT-PORT and TRS-PORT must be output ports. The +current output port is supposed to be redirected to a '.log' file." + + (define (test-on-test-begin-gnu runner) + ;; Procedure called at the start of an individual test case, before the + ;; test expression (and expected value) are evaluated. + (let ((result (cute assq-ref (test-result-alist runner) <>))) + (format #t "test-name: ~A~%" (result 'test-name)) + (format #t "location: ~A~%" + (string-append (result 'source-file) ":" + (number->string (result 'source-line)))) + (test-display "source" (result 'source-form) #:pretty? #t))) + + (define (test-on-test-end-gnu runner) + ;; Procedure called at the end of an individual test case, when the result + ;; of the test is available. + (let* ((results (test-result-alist runner)) + (result? (cut assq <> results)) + (result (cut assq-ref results <>))) + (unless brief? + ;; Display the result of each test case on the console. + (format out-port "~A: ~A - ~A~%" + (result->string (test-result-kind runner) #:colorize? color?) + test-name (test-runner-test-name runner))) + (when (result? 'expected-value) + (test-display "expected-value" (result 'expected-value))) + (when (result? 'expected-error) + (test-display "expected-error" (result 'expected-error) #:pretty? #t)) + (when (result? 'actual-value) + (test-display "actual-value" (result 'actual-value))) + (when (result? 'actual-error) + (test-display "actual-error" (result 'actual-error) #:pretty? #t)) + (format #t "result: ~a~%" (result->string (result 'result-kind))) + (newline) + (format trs-port ":test-result: ~A ~A~%" + (result->string (test-result-kind runner)) + (test-runner-test-name runner)))) + + (define (test-on-group-end-gnu runner) + ;; Procedure called by a 'test-end', including at the end of a test-group. + (let ((fail (or (positive? (test-runner-fail-count runner)) + (positive? (test-runner-xpass-count runner)))) + (skip (or (positive? (test-runner-skip-count runner)) + (positive? (test-runner-xfail-count runner))))) + ;; XXX: The global results need some refinements for XPASS. + (format trs-port ":global-test-result: ~A~%" + (if fail "FAIL" (if skip "SKIP" "PASS"))) + (format trs-port ":recheck: ~A~%" + (if fail "yes" "no")) + (format trs-port ":copy-in-global-log: ~A~%" + (if (or fail skip) "yes" "no")) + (when brief? + ;; Display the global test group result on the console. + (format out-port "~A: ~A~%" + (result->string (if fail 'fail (if skip 'skip 'pass)) + #:colorize? color?) + test-name)) + #f)) + + (let ((runner (test-runner-null))) + (test-runner-on-test-begin! runner test-on-test-begin-gnu) + (test-runner-on-test-end! runner test-on-test-end-gnu) + (test-runner-on-group-end! runner test-on-group-end-gnu) + (test-runner-on-bad-end-name! runner test-on-bad-end-name-simple) + runner)) + +;;; +;;; Entry point. +;;; + +(define (main . args) + (let* ((opts (getopt-long (command-line) %options)) + (option (cut option-ref opts <> <>))) + (cond + ((option 'help #f) (show-help)) + ((option 'version #f) (format #t "test-driver.scm ~A" script-version)) + (else + (let ((log (open-file (option 'log-file "") "w0")) + (trs (open-file (option 'trs-file "") "wl")) + (out (duplicate-port (current-output-port) "wl"))) + (redirect-port log (current-output-port)) + (redirect-port log (current-warning-port)) + (redirect-port log (current-error-port)) + (test-with-runner + (test-runner-gnu (option 'test-name #f) + #:color? (option->boolean opts 'color-tests) + #:brief? (option->boolean opts 'brief) + #:out-port out #:trs-port trs) + (load-from-path (option 'test-name #f))) + (close-port log) + (close-port trs) + (close-port out)))) + (exit 0))) diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..73cdc72 --- /dev/null +++ b/configure.ac @@ -0,0 +1,41 @@ +dnl -*- Autoconf -*- + +AC_INIT(bugafriend, 0.1) +AC_SUBST(HVERSION, "\"0.1\"") +AC_SUBST(AUTHOR, "\"Vivi Langdon\"") +AC_SUBST(COPYRIGHT, "'(2024)") +AC_SUBST(LICENSE, gpl3+) +AC_CONFIG_SRCDIR(bugafriend.scm) +AC_CONFIG_AUX_DIR([build-aux]) +AM_INIT_AUTOMAKE([1.12 gnu silent-rules subdir-objects color-tests parallel-tests -Woverride -Wno-portability]) +AM_SILENT_RULES([yes]) + +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([pre-inst-env], [chmod +x pre-inst-env]) +AC_CONFIG_FILES([scripts/say],[chmod +x scripts/say]) +AC_CONFIG_FILES([scripts/listen],[chmod +x scripts/listen]) +dnl Search for 'guile' and 'guild'. This macro defines +dnl 'GUILE_EFFECTIVE_VERSION'. +GUILE_PKG([3.0 2.2 2.0]) +GUILE_PROGS +GUILE_SITE_DIR +if test "x$GUILD" = "x"; then + AC_MSG_ERROR(['guild' binary not found; please check your guile-2.x installation.]) +fi + +if test "$cross_compiling" != no; then + GUILE_TARGET="--target=$host_alias" + AC_SUBST([GUILE_TARGET]) +fi + +dnl Hall auto-generated guile-module dependencies +GUILE_MODULE_REQUIRED([goblins]) +GUILE_MODULE_REQUIRED([ncurses curses]) + +dnl Installation directories for .scm and .go files. +guilemoduledir="${datarootdir}/guile/site/$GUILE_EFFECTIVE_VERSION" +guileobjectdir="${libdir}/guile/$GUILE_EFFECTIVE_VERSION/site-ccache" +AC_SUBST([guilemoduledir]) +AC_SUBST([guileobjectdir]) + +AC_OUTPUT diff --git a/guix.scm b/guix.scm index 889b7e3..ce5eb41 100644 --- a/guix.scm +++ b/guix.scm @@ -1,29 +1,37 @@ (use-modules - (guix packages) - ((guix licenses) #:prefix license:) - (guix download) - (guix build-system gnu) (gnu packages) (gnu packages autotools) (gnu packages guile) (gnu packages guile-xyz) (gnu packages pkg-config) - (gnu packages texinfo)) + (gnu packages texinfo) + (guix build-system gnu) + (guix download) + (guix gexp) + ((guix licenses) #:prefix license:) + (guix packages) + (srfi srfi-1)) (package (name "bugafriend") (version "0.1") - (source "./bugafriend-0.1.tar.gz") + (source + (local-file + (dirname (current-filename)) + #:recursive? + #t + #:select? + (lambda (file stat) + (not (any (lambda (my-string) + (string-contains file my-string)) + (list ".git" ".dir-locals.el" "guix.scm")))))) (build-system gnu-build-system) (arguments `()) (native-inputs - `(("autoconf" ,autoconf) - ("automake" ,automake) - ("pkg-config" ,pkg-config) - ("texinfo" ,texinfo))) - (inputs `(("guile" ,guile-3.0) - ("guile-goblins" ,guile-goblins))) - (propagated-inputs `()) + (list autoconf automake pkg-config texinfo)) + (inputs (list guile-3.0)) + (propagated-inputs + (list guile-goblins guile-ncurses)) (synopsis "") (description "") (home-page "") diff --git a/hall.scm b/hall.scm index 6593922..86a1cb9 100644 --- a/hall.scm +++ b/hall.scm @@ -3,25 +3,68 @@ (prefix "") (version "0.1") (author "Vivi Langdon") + (email "puttabutta@gmail.com") (copyright (2024)) (synopsis "") (description "") (home-page "") (license gpl3+) - (dependencies `(guile-goblins)) + (dependencies + `(("guile-goblins" (goblins) ,guile-goblins) + ("guile-ncurses" (ncurses curses) ,guile-ncurses))) (skip ()) + (features + ((guix #f) + (use-guix-specs-for-dependencies #f) + (native-language-support #f) + (licensing #t))) (files (libraries ((scheme-file "bugafriend") - (directory "bugafriend" ()))) + (directory + "bugafriend" + ((directory + "utils" + ((compiled-scheme-file "registry") + (scheme-file "registry"))) + (scheme-file "hconfig") + (compiled-scheme-file "hconfig") + (compiled-scheme-file "listener") + (scheme-file "listener") + (compiled-scheme-file "ui") + (scheme-file "ui"))))) (tests ((directory "tests" ()))) - (programs ((directory "scripts" ()))) + (programs + ((directory + "scripts" + ((text-file "listen") + (in-file "say") + (in-file "listen"))))) (documentation ((org-file "README") (symlink "README" "README.org") (text-file "HACKING") (text-file "COPYING") - (directory "doc" ((texi-file "bugafriend"))))) + (directory + "doc" + ((texi-file "version") + (text-file ".dirstamp") + (text-file "stamp-vti") + (info-file "bugafriend") + (texi-file "bugafriend"))) + (text-file "NEWS") + (text-file "AUTHORS") + (text-file "ChangeLog"))) (infrastructure ((scheme-file "guix") (text-file ".gitignore") - (scheme-file "hall"))))) + (scheme-file "hall") + (directory + "build-aux" + ((tex-file "texinfo") + (scheme-file "test-driver") + (text-file "missing") + (text-file "install-sh") + (text-file "mdate-sh"))) + (autoconf-file "configure") + (automake-file "Makefile") + (in-file "pre-inst-env"))))) diff --git a/pre-inst-env.in b/pre-inst-env.in new file mode 100644 index 0000000..31c499d --- /dev/null +++ b/pre-inst-env.in @@ -0,0 +1,13 @@ +#!/bin/sh + +abs_top_srcdir="`cd "@abs_top_srcdir@" > /dev/null; pwd`" +abs_top_builddir="`cd "@abs_top_builddir@" > /dev/null; pwd`" + +GUILE_LOAD_COMPILED_PATH="$abs_top_builddir${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH" +GUILE_LOAD_PATH="$abs_top_builddir:$abs_top_srcdir${GUILE_LOAD_PATH:+:}:$GUILE_LOAD_PATH" +export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH + +PATH="$abs_top_builddir/scripts:$PATH" +export PATH + +exec "$@" diff --git a/scripts/listen b/scripts/listen new file mode 100755 index 0000000..ad9a868 --- /dev/null +++ b/scripts/listen @@ -0,0 +1,17 @@ +#!/home/vv/.guix-profile/bin/guile --no-auto-compile +-*- scheme -*- +!# + +(use-modules + (goblins) + (goblins ocapn ids) + (fibers conditions) + (bugafriend listener)) + +;; So far nothing triggers this for listener +(define can-quit? (make-condition)) + +(with-vat (spawn-vat #:name "Listener UI") + (listen (string->ocapn-id (list-ref (command-line) 1)))) + +(wait can-quit?) diff --git a/scripts/listen.in b/scripts/listen.in new file mode 100644 index 0000000..c236730 --- /dev/null +++ b/scripts/listen.in @@ -0,0 +1,17 @@ +#!@GUILE@ --no-auto-compile +-*- scheme -*- +!# + +(use-modules + (goblins) + (goblins ocapn ids) + (fibers conditions) + (bugafriend listener)) + +;; So far nothing triggers this for listener +(define can-quit? (make-condition)) + +(with-vat (spawn-vat #:name "Listener UI") + (listen (string->ocapn-id (list-ref (command-line) 1)))) + +(wait can-quit?) \ No newline at end of file diff --git a/scripts/say b/scripts/say new file mode 100755 index 0000000..661eeaf --- /dev/null +++ b/scripts/say @@ -0,0 +1,11 @@ +#!/home/vv/.guix-profile/bin/guile --no-auto-compile +-*- scheme -*- +!# + +(use-modules + (goblins) + (goblins ocapn ids) + (bugafriend ui)) + +(with-vat (spawn-vat #:name "Speaker UI") + (say (string->ocapn-id (list-ref (command-line) 1)))) diff --git a/scripts/say.in b/scripts/say.in new file mode 100644 index 0000000..7f8a147 --- /dev/null +++ b/scripts/say.in @@ -0,0 +1,11 @@ +#!@GUILE@ --no-auto-compile +-*- scheme -*- +!# + +(use-modules + (goblins) + (goblins ocapn ids) + (bugafriend ui)) + +(with-vat (spawn-vat #:name "Speaker UI") + (say (string->ocapn-id (list-ref (command-line) 1))))