0 | module Network.HTTP.Cookie
3 | import Data.String.Extra
5 | import Derive.Prelude
7 | %language ElabReflection
11 | constructor MkCookie
14 | attributes : List (String, Maybe String)
17 | record CookieJar where
18 | constructor MkCookieJar
19 | cookies : List Cookie
21 | %runElab derive "Cookie" [Eq, Ord, Show]
22 | %runElab derive "CookieJar" [Eq, Ord, Show]
25 | serialize_cookie_no_attr : Cookie -> String
26 | serialize_cookie_no_attr cookie = "\{cookie.key}=\{cookie.value}"
29 | serialize_cookie : Cookie -> String
30 | serialize_cookie cookie = join "; " (serialize_cookie_no_attr cookie :: map serialize_attr cookie.attributes) where
31 | serialize_attr : (String, Maybe String) -> String
32 | serialize_attr (k, Nothing) = k
33 | serialize_attr (k, Just v) = "\{k}=\{v}"
36 | same_key : Cookie -> Cookie -> Bool
37 | same_key a b = a.key == b.key
40 | add_cookie : CookieJar -> Cookie -> CookieJar
41 | add_cookie jar cookie = MkCookieJar $
(cookie :: filter (not . same_key cookie) jar.cookies)
44 | deserialize_cookie : String -> Maybe Cookie
45 | deserialize_cookie string = do
46 | let (kv ::: attrs) = split (';' ==) string
47 | guard (isInfixOf "=" kv)
48 | let (k, v) = splitBy '=' kv
49 | pure $
MkCookie k v (map parse_attr attrs)
51 | parse_attr : String -> (String, Maybe String)
52 | parse_attr attr = bimap ltrim (guard (isInfixOf "=" attr) $>) $
splitBy '=' attr