From d89d837de3475b75587a4293e094d755d2cd4626 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Tue, 17 Nov 2020 20:23:53 -0400 Subject: Made the syntax of ^template more consistent. --- stdlib/source/program/aedifex/repository.lux | 43 +++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 7 deletions(-) (limited to 'stdlib/source/program/aedifex/repository.lux') 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) -- cgit v1.2.3