80 lines
2.2 KiB
Plaintext
80 lines
2.2 KiB
Plaintext
use std::http::jsonClient
|
|
|
|
fn main = jsonClient() # json client
|
|
post 'http://localhost:1234/login', username: 'test', password: 'test' # Either<Err, Response>
|
|
-> || ( it.body.accessToken ) # Either<Error, *>
|
|
|> println # IO
|
|
()
|
|
|
|
# Without operators
|
|
|
|
fn main = jsonClient()
|
|
post 'http://localhost:1234/login', username: 'test', password: 'test'
|
|
map || ( it.body.accessToken )
|
|
fold println
|
|
()
|
|
|
|
# Better: main which returns IO (a Callable?) automatically calls the IO
|
|
# Also, JsonClient can "login" using various methods, such as a Bearer token
|
|
|
|
use std::http::{jsonClient, bearerToken}
|
|
|
|
fn main = jsonClient(
|
|
baseUrl: 'http:/localhost:1234',
|
|
auth: bearerToken || ( post('/login', username: 'test', password: 'test') map || ( it.body.accessToken ) )
|
|
)
|
|
get '/greeting'
|
|
map || ( it.body.greeting )
|
|
fold println
|
|
|
|
pub int HttpReqOpts {
|
|
headers: Map<String, Any>
|
|
}
|
|
|
|
pub int GetOpts : HttpReqOpts
|
|
|
|
pub int HttpClient {
|
|
baseUrl: String
|
|
fn get(path: String, opts?: GetOpts): IOEither<HttpRequestError, HttpResponse>
|
|
fn post(path: String, body: Any, opts: PostOpts): IOEither<HttpRequestError, HttpResponse>
|
|
}
|
|
|
|
pub int JsonClient : HttpClient
|
|
|
|
pub int JsonClientOpts {
|
|
baseUrl: String
|
|
fn getAuth(#[self] client: JsonClient) -> HttpClientAuth
|
|
}
|
|
|
|
pub int HttpClientAuth = (reqBuilder: HttpRequest::Builder) -> Void
|
|
|
|
impl : JsonClient {
|
|
baseUrl: String
|
|
fld auth: HttpClientAuth
|
|
|
|
ctor (opts: JsonClientOpts) {
|
|
self.baseUrl = opts.baseUrl
|
|
self.auth = opts.getAuth(self)
|
|
}
|
|
|
|
impl fn get(path, opts) = IOEither::of || (
|
|
HttpRequest::builder() tap || {
|
|
url = baseUrl + path
|
|
method = 'GET'
|
|
headers = opts?.headers ?: [:]
|
|
cookies = opts?.cookies ?: [:]
|
|
auth(self)
|
|
}()
|
|
)
|
|
}
|
|
|
|
pub fn jsonClient(opts: JsonClientOpts): JsonClient = JsonClientImpl(opts)
|
|
|
|
pub fn bearerToken(tokenGetter: (#[self] client: JsonClient) -> IOEither<HttpRequestError, String>) {
|
|
|client: JsonClient| {
|
|
let token = tokenGetter.hydrate(self: client)().unwrap()
|
|
|reqBuilder: HttpRequest::Builder| {
|
|
reqBuilder.headers['Authorization'] = "Bearer $token"
|
|
}
|
|
}
|
|
} |