aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/program/aedifex/repository
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/program/aedifex/repository')
-rw-r--r--stdlib/source/program/aedifex/repository/local.lux58
1 files changed, 58 insertions, 0 deletions
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]))))