aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gn3-guile/README.md3
-rw-r--r--gn3-guile/web/.guix-shell8
-rw-r--r--gn3-guile/web/static/README.md2
-rwxr-xr-xgn3-guile/web/webserver.scm71
4 files changed, 84 insertions, 0 deletions
diff --git a/gn3-guile/README.md b/gn3-guile/README.md
new file mode 100644
index 0000000..36ed956
--- /dev/null
+++ b/gn3-guile/README.md
@@ -0,0 +1,3 @@
+# GN3 Guile Webservice
+
+This directory provides a Guile endpoint for the REST API. It is used in conjunction with the Python REST API and WIP.
diff --git a/gn3-guile/web/.guix-shell b/gn3-guile/web/.guix-shell
new file mode 100644
index 0000000..3834f90
--- /dev/null
+++ b/gn3-guile/web/.guix-shell
@@ -0,0 +1,8 @@
+#!/bin/bash
+#
+# run with options '-- ./webserver.scm 8091' e.g.
+# . .guix-shell -- guile -e main ./webserver.scm 8091
+
+echo "Note run: running web-server"
+
+guix shell guile guile-json gnutls guile-readline guile-redis openssl nss-certs $*
diff --git a/gn3-guile/web/static/README.md b/gn3-guile/web/static/README.md
new file mode 100644
index 0000000..8cb1b8c
--- /dev/null
+++ b/gn3-guile/web/static/README.md
@@ -0,0 +1,2 @@
+IMPORTANT: this is a REST server. Any static CSS and HTML should be handled in
+the GN2 code base(!)
diff --git a/gn3-guile/web/webserver.scm b/gn3-guile/web/webserver.scm
new file mode 100755
index 0000000..f5fedd7
--- /dev/null
+++ b/gn3-guile/web/webserver.scm
@@ -0,0 +1,71 @@
+#!/usr/bin/env guile \
+-e main -s
+!#
+;; Minimal web server can be started from command line. Current example routes:
+;;
+;; localhost:8080/version.json
+;;
+;; Note that this is a single blocking thread server right now.
+
+(use-modules (json)
+ (web server)
+ (web request)
+ (web response)
+ (web uri))
+
+(define (get-version-str)
+ "\"1.0\"")
+
+(define info-list (scm->json-string '(
+ ("name"."GeneNetwork REST API")
+ ("version"."1.0")
+ ("note"."work in progress (WIP)")
+ )))
+
+(define (get-gn-info-str)
+ info-list
+ )
+
+(define (get-species-str)
+ "{
+\"Mus_musculus\": {
+ \"id\": \"mouse\"
+ },
+\"Rattus_norvegicus\": {
+ \"id\": \"rat\"
+ }
+}")
+
+;; ---- REST API web server handler
+
+(define (hello-world-handler request body)
+ (let ((path (uri-path (request-uri request))))
+ (cond
+ ((member path (list "/version.json"))
+ (values '((content-type . (application/json)))
+ (get-version-str)
+ ))
+ ((member path (list "/species/"))
+ (values '((content-type . (application/json)))
+ (get-species-str)
+ ))
+ ((member path (list "/"))
+ (values '((content-type . (application/json)))
+ (get-gn-info-str)
+ ))
+ (else
+ (not-found request)))))
+
+(define (not-found request)
+ (values (build-response #:code 404)
+ (string-append "Resource not found: "
+ (uri->string (request-uri request)))))
+
+(define (main args)
+ (write "Starting Guile REST API server!")
+ (write args)
+ (newline)
+ (let ((listen (inexact->exact (string->number (car (cdr args))))))
+ (display `("listening on" ,listen))
+ ;; (write listen)
+ (run-server hello-world-handler 'http `(#:port ,listen))))