(.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.def .public ( [url status]) (Exception [URL Nat]) (exception.report (list ["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))] (when status http/status.ok (of ! each product.right ((the @http.#body message) {.#None})) _ (do ! [_ ((the @http.#body message) {.#Some 0})] (of 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 (when 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})] (when status http/status.created (in []) _ (of io.monad in (exception.except ..upload_failure [(format address uri) status]))))) ))