espresso/form
Types
pub type FormDecodeError {
UnexpectedFormat(List(dynamic.DecodeError))
}
Constructors
-
UnexpectedFormat(List(dynamic.DecodeError))
Functions
pub fn decode(body: String, decoder: fn(Dynamic) ->
Result(a, List(DecodeError))) -> Result(a, FormDecodeError)
Parses form encoded data
Examples
pub type Note {
Note(id: Int, title: String, content: String)
}
pub fn decode(body: String) {
let decoder =
dynamic.decode3(
Note,
dynamic.field("id", of: dynamic.int),
dynamic.field("title", of: dynamic.string),
dynamic.field("content", of: dynamic.string),
)
form.decode(body, decoder)
}
decode(“id=1&title=Hello&content=World”) Ok(Note(1, “Hello”, “World”))
You can couple this with a request middleware to parse the body of a request
pub fn create_decoder(
handler: Service(Result(Note, form.FormDecodeError), assigns, session, res),
) -> Service(BitString, assigns, session, res) {
fn(req: Request(BitString, assigns, session)) -> Response(res) {
request.map(
req,
fn(body) {
body
|> bit_string.to_string()
|> result.unwrap("")
|> decode()
},
)
|> handler()
}
}
...
router.get(
"/",
{
use req: Request(Result(Note, form.FormDecodeError), assigns, session) <- create_decoder
case req.body {
Ok(note) -> send(202, note.content)
t -> {
io.debug(t)
send(400, "Bad Request")
}
}
},
)