diff options
author | Eduardo Julian | 2020-10-03 12:55:45 -0400 |
---|---|---|
committer | Eduardo Julian | 2020-10-03 12:55:45 -0400 |
commit | 618b1ce9743bb79f1ae3375b05a394a4183b21e8 (patch) | |
tree | dd6890c38bcf182d67cd0d7acccf11edb65143fb /stdlib/source/program/aedifex/upload.lux | |
parent | c10e3c13866ef25bab020ec597fd11aa8d01c862 (diff) |
Added deployment code to Aedifex.
Diffstat (limited to '')
-rw-r--r-- | stdlib/source/program/aedifex/upload.lux | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/stdlib/source/program/aedifex/upload.lux b/stdlib/source/program/aedifex/upload.lux new file mode 100644 index 000000000..8b849ed10 --- /dev/null +++ b/stdlib/source/program/aedifex/upload.lux @@ -0,0 +1,100 @@ +(.module: + [lux #* + ["." host (#+ import:)] + [abstract + [monad (#+ Monad do)]] + [control + ["." io (#+ IO)] + ["." try (#+ Try)] + ["." exception (#+ exception:)]] + [data + ["." binary (#+ Binary)] + ["." text + ["%" format (#+ format)] + ["." encoding]]] + [time + ["." instant]] + [world + [net (#+ URL) + ["." uri]]]] + ["." // #_ + ["#." dependency (#+ Repository Dependency)] + ["#." artifact]]) + +(type: #export (Action a) + (IO (Try a))) + +(def: #export monad + (:coerce (Monad Action) + (try.with io.monad))) + +(type: #export User + Text) + +(type: #export Password + Text) + +(def: (url repository dependency) + (-> Repository Dependency URL) + (format repository + uri.separator + (//artifact.path (get@ #//dependency.artifact dependency)) + "." + (get@ #//dependency.type dependency))) + +(import: #long java/lang/AutoCloseable + (close [] #io #try void)) + +(import: #long java/io/OutputStream + (flush [] #io #try void) + (write [[byte]] #io #try void)) + +(import: #long java/lang/String) + +(import: #long java/net/URLConnection + (setDoOutput [boolean] #io #try void) + (setRequestProperty [java/lang/String java/lang/String] #io #try void) + (getOutputStream [] #io #try java/io/OutputStream)) + +(import: #long java/net/HttpURLConnection + (setRequestMethod [java/lang/String] #io #try void) + (getResponseCode [] #io #try int)) + +(import: #long java/net/URL + (new [java/lang/String]) + (openConnection [] #io #try java/net/URLConnection)) + +(import: #long java/util/Base64$Encoder + (encodeToString [[byte]] java/lang/String)) + +(import: #long java/util/Base64 + (#static getEncoder [] java/util/Base64$Encoder)) + +(exception: #export (failure {code Int}) + (exception.report + ["Code" (%.int code)])) + +(def: (basic-auth user password) + (-> User Password Text) + (format "Basic " (java/util/Base64$Encoder::encodeToString (encoding.to-utf8 (format user ":" password)) + (java/util/Base64::getEncoder)))) + +(def: #export (upload repository user password dependency content) + (-> Repository User Password Dependency Binary + (Action Any)) + (do {@ ..monad} + [connection (|> (..url repository dependency) + java/net/URL::new + java/net/URL::openConnection) + #let [connection (:coerce java/net/HttpURLConnection connection)] + _ (java/net/HttpURLConnection::setRequestMethod "PUT" connection) + _ (java/net/URLConnection::setDoOutput true connection) + _ (java/net/URLConnection::setRequestProperty "Authorization" (..basic-auth user password) connection) + stream (java/net/URLConnection::getOutputStream connection) + _ (java/io/OutputStream::write content stream) + _ (java/io/OutputStream::flush stream) + _ (java/lang/AutoCloseable::close stream) + code (java/net/HttpURLConnection::getResponseCode connection)] + (case code + +200 (wrap []) + _ (:: io.monad wrap (exception.throw ..failure [code]))))) |