aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/program/aedifex/repository.lux
diff options
context:
space:
mode:
authorEduardo Julian2020-11-17 20:23:53 -0400
committerEduardo Julian2020-11-17 20:23:53 -0400
commitd89d837de3475b75587a4293e094d755d2cd4626 (patch)
tree0975a487d987cfe855c4f6e87f05478346913a16 /stdlib/source/program/aedifex/repository.lux
parent2e5852abb1ac0ae5abdd8709238aca447f62520e (diff)
Made the syntax of ^template more consistent.
Diffstat (limited to 'stdlib/source/program/aedifex/repository.lux')
-rw-r--r--stdlib/source/program/aedifex/repository.lux43
1 files changed, 36 insertions, 7 deletions
diff --git a/stdlib/source/program/aedifex/repository.lux b/stdlib/source/program/aedifex/repository.lux
index 0c8f92993..5c622d84b 100644
--- a/stdlib/source/program/aedifex/repository.lux
+++ b/stdlib/source/program/aedifex/repository.lux
@@ -11,10 +11,12 @@
["." promise (#+ Promise)]
["." stm]]]
[data
- [binary (#+ Binary)]
+ ["." binary (#+ Binary)]
["." text
["%" format (#+ format)]
- ["." encoding]]]
+ ["." encoding]]
+ [number
+ ["n" nat]]]
[world
[net (#+ URL)
["." uri]]]]
@@ -90,6 +92,8 @@
(wrap (#try.Failure error))))))
)))
+(import: java/lang/String)
+
(import: java/lang/AutoCloseable
(close [] #io #try void))
@@ -97,8 +101,6 @@
(flush [] #io #try void)
(write [[byte]] #io #try void))
-(import: java/lang/String)
-
(import: java/net/URLConnection
(setDoOutput [boolean] #io #try void)
(setRequestProperty [java/lang/String java/lang/String] #io #try void)
@@ -110,7 +112,8 @@
(import: java/net/URL
(new [java/lang/String])
- (openConnection [] #io #try java/net/URLConnection))
+ (openConnection [] #io #try java/net/URLConnection)
+ (openStream [] #io #try java/io/InputStream))
(import: java/util/Base64$Encoder
(encodeToString [[byte]] java/lang/String))
@@ -118,6 +121,12 @@
(import: java/util/Base64
(#static getEncoder [] java/util/Base64$Encoder))
+(import: java/io/InputStream)
+
+(import: java/io/BufferedInputStream
+ (new [java/io/InputStream])
+ (read [[byte] int int] #io #try int))
+
(exception: #export (failure {code Int})
(exception.report
["Code" (%.int code)]))
@@ -131,11 +140,31 @@
(-> Address Artifact Extension URL)
(format address uri.separator (//artifact.uri artifact) extension))
-(structure: #export (default address)
+(def: buffer-size
+ (n.* 512 1,024))
+
+(structure: #export (remote address)
(All [s] (-> Address (Repository IO)))
(def: (download artifact extension)
- (io.io (#try.Failure "YOLO")))
+ (let [url (..url address artifact extension)]
+ (do {! (try.with io.monad)}
+ [input (|> (java/net/URL::new url)
+ java/net/URL::openStream
+ (:: ! map (|>> java/io/BufferedInputStream::new)))
+ #let [buffer (binary.create ..buffer-size)]]
+ (loop [output (:: binary.monoid identity)]
+ (do !
+ [bytes-read (java/io/BufferedInputStream::read buffer +0 (.int ..buffer-size) input)]
+ (case bytes-read
+ -1 (do !
+ [_ (java/lang/AutoCloseable::close input)]
+ (wrap output))
+ _ (if (n.= ..buffer-size bytes-read)
+ (recur (:: binary.monoid compose output buffer))
+ (do !
+ [chunk (:: io.monad wrap (binary.slice 0 (.nat bytes-read) buffer))]
+ (recur (:: binary.monoid compose output chunk))))))))))
(def: (upload [user password] artifact extension content)
(do (try.with io.monad)