@@ -14,17 +14,18 @@ module Gen.Syntax where
15import Control.Lens hiding (iso, mapping, op, pre,
15import Control.Lens hiding (iso, mapping, op, pre,
17import Data.Foldable (find, foldl', foldr')
18import Data.Foldable (find, foldl', foldr')
18import Data.Hashable
19import Data.Hashable
19import qualified Data.HashMap.Strict as Map
20import qualified Data.HashMap.Strict as Map
20−import Data.List (delete)
21+import Data.List (delete, nub)
22import Data.Maybe
22import Data.Maybe
23import Data.Semigroup ((<>))
23import Data.Semigroup ((<>))
24import Data.String
24import Data.String
25import Data.Text (Text)
25import Data.Text (Text)
26import qualified Data.Text as Text
26import qualified Data.Text as Text
27import Data.Text.Manipulate
27import Data.Text.Manipulate
28import Gen.Orphans
29import Gen.Orphans
29import Gen.Text
30import Gen.Text
30import Gen.Types
31import Gen.Types
@@ -56,26 +57,31 @@ verbAlias n m
57 rest = alias verb (path ++ qry params ++ media)
58 rest = alias verb (path ++ qry params ++ media)
58 download = TyInfix rest (UnQual (sym ":<|>")) $
59 download = TyInfix rest (UnQual (sym ":<|>")) $
59− alias (TyApp (TyApp meth octet) (TyCon "Stream"))
60+ alias (TyApp (TyApp meth octet) (TyCon "Body"))
60 (path ++ qry (Map.delete "alt" (_mParameters m)) ++ [alt] ++ media)
61 (path ++ qry (Map.delete "alt" (_mParameters m)) ++ [alt] ++ media)
62 alias = foldr' (\l r -> TyInfix l (UnQual (sym ":>")) r)
63 alias = foldr' (\l r -> TyInfix l (UnQual (sym ":>")) r)
64 path :: [Type]
65 path :: [Type]
65− path = map match
66+ path = map match $ extractPath (_mPath m)
66− . filter (not . Text.null)
67− $ Text.split (== '/') (_mPath m)
69− -- FIXME: should error if '{' '}' is found and cannot find the ref.
68+ match (Left t) = sing t
70− match x
69+ match (Right (l, c)) =
71− | Just (c, t) <- Text.uncons x
70+ case Map.lookup l (_mParameters m) of
72− , c == '{'
71+ Nothing -> error $ "Unable to find path parameter " ++ show l
73− , Just k <- Map.lookup (toKey (Text.init t)) params
72+ Just x ->
74− , _pLocation k == Path
73+ case c of
75− = TyApp (TyApp (TyCon "Capture")
75+ TyApp (TyApp (TyCon "Capture")
76− (sing (Text.init t)))
76+ (sing (local l)))
77− (terminalType (_type (_pParam k)))
77+ (terminalType (_type (_pParam x)))
80+ TyApp (TyApp (TyApp (TyCon "CaptureMode")
78− | otherwise = sing x
82+ (sing y))
83+ (terminalType (_type (_pParam x)))
80 qry xs = mapMaybe f $ orderParams fst (Map.toList xs) (_mParameterOrder m)
86 qry xs = mapMaybe f $ orderParams fst (Map.toList xs) (_mParameterOrder m)
@@ -106,9 +112,9 @@ verbAlias n m
106 octet = tylist ["OctetStream"]
112 octet = tylist ["OctetStream"]
107 json = tylist ["JSON"]
113 json = tylist ["JSON"]
109− alt = TyApp (TyApp (TyCon "QueryParam") (sing "alt")) (TyCon "Media")
115+ alt = TyApp (TyApp (TyCon "QueryParam") (sing "alt")) (TyCon "AltMedia")
111− params = _mParameters m
117+ params = Map.filter ((/= Path) . _pLocation) (_mParameters m)
113downloadDecl :: Global
119downloadDecl :: Global
114 -> Prefix
120 -> Prefix
@@ -122,7 +128,7 @@ downloadDecl n p api url fs m =
123 rs = InsType noLoc
129 rs = InsType noLoc
124 (TyApp (TyCon "Rs") (TyApp (TyCon "Download") (tycon n)))
130 (TyApp (TyCon "Rs") (TyApp (TyCon "Download") (tycon n)))
125− (TyCon "Stream")
131+ (TyCon "Body")
127 alt = Just (var "Media")
133 alt = Just (var "Media")
@@ -191,10 +197,13 @@ googleRequestDecl g n assoc alt p api url fields m =
191 ps = _mParameters m
197 ps = _mParameters m
192 v = var . fname p
198 v = var . fname p
194− (fs', rq) | Just r <- _mRequest m = let x = localise (ref r) in (delete x fs, Just x)
200+ (fs', rq) | Just _ <- _mRequest m = (delete "payload" fs, Just "payload")
195 | otherwise = (fs, Nothing)
201 | otherwise = (fs, Nothing)
204+ . orderParams id (Map.keys (_mParameters m))
197− fs = orderParams id fields (_mParameterOrder m)
206+ $ map fst (rights (extractPath (_mPath m))) ++ _mParameterOrder m
199 pats = [pvar "r", pvar "u", prec]
208 pats = [pvar "r", pvar "u", prec]
200 prec = PRec (UnQual (dname g)) [PFieldWildcard]
209 prec = PRec (UnQual (dname g)) [PFieldWildcard]