
Options.pudu
Pudu48 lines1.9 KB
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] }91011export fn empty() -> Options { Options{entries: mapOf([])} }121314export 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}171819export fn textKey(name: Str) -> Key[Str] { key(name, |value: Str| value, |written: Str| Some(written)) }202122export fn intKey(name: Str) -> Key[Int] { key(name, |value: Int| show(value), |written: Str| written.toInt()) }232425export 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}282930export fn set[T](options: &Options, name: &Key[T], value: T) -> Options {31 Options{entries: options.entries.insert(name.name, (name.encode)(value))}32}333435export fn get[T](options: &Options, name: &Key[T]) -> Option[T] {36 let written = options.entries.get(name.name) ?37 (name.decode)(written)38}394041export fn has[T](options: &Options, name: &Key[T]) -> Bool { options.entries.containsKey(name.name) }424344export fn remove[T](options: &Options, name: &Key[T]) -> Options { Options{entries: options.entries.remove(name.name)} }454647export fn names(options: &Options) -> Array[Str] { options.entries.keys() }48