Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-httpclient

Named HTTP clients for Pudu: a client factory, delegating handlers, pooled keep-alive connections, handler lifetimes, logging, and resilience

0.1.1Apache-2.01

InstallClose

Options.pudu

Pudu48 lines1.9 KB

GitHub ↗
1/** @HttpClient.Options.Module — typed values a request carries for its handlers */2module PuduLangHttpClient.Options34/** @HttpClient.Options.Options — a request's options, by name */5export type Options = { entries: Map[Str, Str] }67/** @HttpClient.Options.Key — the name of one option and how its value is written and read */8export type Key[T] = { name: Str, encode: fn(T) -> Str, decode: fn(Str) -> Option[T] }910/// No options.11export fn empty() -> Options { Options{entries: mapOf([])} }1213/// A key for values written and read by the given functions.14export fn key[T](name: Str, encode: fn(T) -> Str, decode: fn(Str) -> Option[T]) -> Key[T] {15  Key{name: name, encode: encode, decode: decode}16}1718/// A key for text values.19export fn textKey(name: Str) -> Key[Str] { key(name, |value: Str| value, |written: Str| Some(written)) }2021/// A key for whole numbers.22export fn intKey(name: Str) -> Key[Int] { key(name, |value: Int| show(value), |written: Str| written.toInt()) }2324/// A key for flags.25export fn boolKey(name: Str) -> Key[Bool] {26  key(name, |value: Bool| if value { "true" } else { "false" }, |written: Str| if written == "true" { Some(true) } else if written == "false" { Some(false) } else { None })27}2829/// The options with the key's value set.30export fn set[T](options: &Options, name: &Key[T], value: T) -> Options {31  Options{entries: options.entries.insert(name.name, (name.encode)(value))}32}3334/// The key's value, when it is set and reads back as one.35export fn get[T](options: &Options, name: &Key[T]) -> Option[T] {36  let written = options.entries.get(name.name) ?37  (name.decode)(written)38}3940/// Whether the key is set.41export fn has[T](options: &Options, name: &Key[T]) -> Bool { options.entries.containsKey(name.name) }4243/// The options without the key.44export fn remove[T](options: &Options, name: &Key[T]) -> Options { Options{entries: options.entries.remove(name.name)} }4546/// The names of every option set, in order.47export fn names(options: &Options) -> Array[Str] { options.entries.keys() }48