From 02d27daeacac74785c2b0f4d1ce03d432377a36e Mon Sep 17 00:00:00 2001
From: Eduardo Julian
Date: Tue, 29 Dec 2020 23:29:54 -0400
Subject: Unified repository abstraction for Aedifex.

---
 stdlib/source/program/aedifex/repository/local.lux | 58 ++++++++++++++++++++++
 1 file changed, 58 insertions(+)
 create mode 100644 stdlib/source/program/aedifex/repository/local.lux

(limited to 'stdlib/source/program/aedifex/repository')

diff --git a/stdlib/source/program/aedifex/repository/local.lux b/stdlib/source/program/aedifex/repository/local.lux
new file mode 100644
index 000000000..393861ccf
--- /dev/null
+++ b/stdlib/source/program/aedifex/repository/local.lux
@@ -0,0 +1,58 @@
+(.module:
+  [lux #*
+   [host (#+ import:)]
+   [abstract
+    [monad (#+ do)]]
+   [control
+    ["." try (#+ Try)]
+    [concurrency
+     ["." promise (#+ Promise)]]
+    [security
+     ["!" capability]]]
+   [data
+    ["." text
+     ["%" format (#+ format)]]]
+   [world
+    [program (#+ Program)]
+    ["." file (#+ Path File)]
+    [net
+     ["." uri (#+ URI)]]]]
+  ["." //
+   ["/#" // #_
+    ["#." local]]])
+
+(def: (root /)
+  (-> Text Path)
+  (text.replace_all uri.separator / ///local.repository))
+
+(def: path
+  (-> Text URI Path)
+  (text.replace_all uri.separator))
+
+(def: (file program system uri)
+  (-> (Program Promise)
+      (file.System Promise)
+      URI
+      (Promise (Try (File Promise))))
+  (do {! promise.monad}
+    [home (\ program home [])
+     #let [/ (\ system separator)
+           absolute_path (format home / (..root /) / (..path / uri))]]
+    (do {! (try.with !)}
+      [_ (: (Promise (Try Path))
+            (file.make_directories promise.monad system (file.parent system absolute_path)))]
+      (: (Promise (Try (File Promise)))
+         (file.get_file promise.monad system absolute_path)))))
+
+(structure: #export (repository program system)
+  (-> (Program Promise) (file.System Promise) (//.Repository Promise))
+
+  (def: (download uri)
+    (do {! (try.with promise.monad)}
+      [file (..file program system uri)]
+      (!.use (\ file content) [])))
+
+  (def: (upload uri content)
+    (do {! (try.with promise.monad)}
+      [file (..file program system uri)]
+      (!.use (\ file over_write) [content]))))
-- 
cgit v1.2.3