(.require [library [lux (.except) [abstract [monad (.only do)]] [control ["[0]" io (.only IO)] ["[0]" try (.only Try)] ["[0]" exception (.only exception)]] [data ["[0]" product] [text ["%" \\format (.only format)]] [collection ["[0]" list]]] ["[0]" meta ["[1]/[0]" version] [compiler ["[0]" version]]] [world [net (.only URL) [uri (.only URI)] ["[0]" http ["[1]" client] ["[1]/[0]" status] ["@[1]" /]]]]]] ["[0]" // (.only) ["[1][0]" identity (.only Identity)] ["/[1]" // ["[1][0]" artifact (.only Version Artifact) [extension (.only Extension)]]]]) (type .public Address URL) (with_template [] [(exception .public ( [url URL status Nat]) (exception.report "URL" (%.text url) "Status Code" (%.nat status)))] [download_failure] [upload_failure] ) (def .public (uri version_template artifact extension) (-> Version Artifact Extension URI) (format (///artifact.uri version_template artifact) extension)) (def .public user_agent (format "LuxAedifex/" (version.format meta/version.latest))) (def base_headers (List [Text Text]) (list ["User-Agent" ..user_agent])) (def .public (repository http identity address) (All (_ s) (-> (http.Client IO) (Maybe Identity) Address (//.Repository IO))) (implementation (def description address) (def (download uri) (do [! (try.with io.monad)] [[status message] (is (IO (Try (@http.Response IO))) (http.get (format address uri) (http.headers ..base_headers) {.#None} http))] (case status (static http/status.ok) (at ! each product.right ((the @http.#body message) {.#None})) _ (do ! [_ ((the @http.#body message) {.#Some 0})] (at io.monad in (exception.except ..download_failure [(format address uri) status])))))) (def (upload uri content) (do (try.with io.monad) [[status message] (is (IO (Try (@http.Response IO))) (http.put (format address uri) (http.headers (case identity {.#None} ..base_headers {.#Some [user password]} (list.partial ["Authorization" (//identity.basic_auth user password)] ..base_headers))) {.#Some content} http)) _ ((the @http.#body message) {.#Some 0})] (case status (static http/status.created) (in []) _ (at io.monad in (exception.except ..upload_failure [(format address uri) status]))))) ))