@@ -36,8 +36,9 @@ import Data.Aeson hiding (Bool, String)
36import Data.Aeson.TH
36import Data.Aeson.TH
37import Data.Char
37import Data.Char
38import Data.Function (on)
38import Data.Function (on)
39+import qualified Data.HashMap.Strict as Map
39import qualified Data.HashSet as Set
40import qualified Data.HashSet as Set
40−import Data.List (groupBy)
41+import Data.List (groupBy, sort)
41import Data.List.NonEmpty (NonEmpty (..))
42import Data.List.NonEmpty (NonEmpty (..))
42import qualified Data.List.NonEmpty as NE
43import qualified Data.List.NonEmpty as NE
43import Data.Maybe
44import Data.Maybe
@@ -82,6 +83,7 @@ data Templates = Templates
82 , typesTemplate :: Template
83 , typesTemplate :: Template
83 , prodTemplate :: Template
84 , prodTemplate :: Template
84 , sumTemplate :: Template
85 , sumTemplate :: Template
86+ , actionTemplate :: Template
87newtype Version (v :: Symbol) = Version Text
89newtype Version (v :: Symbol) = Version Text
@@ -271,6 +273,13 @@ data Param = Param
271 , _prmLiteral :: !Lit
273 , _prmLiteral :: !Lit
276+paramSchema :: Param -> Fix Schema
278+ | _prmRepeated p = Fix $ Arr (_prmInfo p) lit
281+ lit = Fix $ Lit (_prmInfo p) (_prmLiteral p)
274instance FromJSON Param where
283instance FromJSON Param where
275 parseJSON = withObject "parameter" $ \o -> Param
284 parseJSON = withObject "parameter" $ \o -> Param
276 <$> o .: "location"
285 <$> o .: "location"
@@ -327,22 +336,33 @@ instance ToJSON Data where
327 , "instances" .= is
336 , "instances" .= is
330−data Action = Action Name (Maybe Help) Rendered
339+data Action = Action
342+ , _actHelp :: Maybe Help
343+ , _actAlias :: Rendered
332instance ToJSON Action where
347instance ToJSON Action where
333− toJSON (Action n h d) = object
348+ toJSON (Action n _ h a d) = object
334− [ "name" .= Syn n
349+ [ "name" .= Syn n
335− , "help" .= h
350+ , "help" .= h
336− , "decl" .= d
351+ , "alias" .= a
339−data API = API Name Rendered [Action]
355+data API = API
357+ , _apiDecl :: Rendered
358+ , _apiActions :: Map Name Action
341instance ToJSON API where
361instance ToJSON API where
342 toJSON (API n d as) = object
362 toJSON (API n d as) = object
343 [ "name" .= Syn n
363 [ "name" .= Syn n
344 , "decl" .= d
364 , "decl" .= d
345− , "actions" .= as
365+ , "actions" .= Map.elems as
348data Method = Method
368data Method = Method
@@ -440,10 +460,14 @@ instance ToJSON (Service Data API) where
440svcAbbrev :: Service s r -> Text
460svcAbbrev :: Service s r -> Text
441svcAbbrev = upperHead . renameAbbrev . _svcCanonicalName
461svcAbbrev = upperHead . renameAbbrev . _svcCanonicalName
463+svcActions :: Service s API -> [NS]
464+svcActions = map _actNS . Map.elems . _apiActions . _svcApi
443−typeImports, prodImports, sumImports :: Service s r -> [NS]
466+typeImports, prodImports, sumImports, actionImports :: Service s r -> [NS]
444−typeImports s = ["Network.Google.Prelude", prodNS s, sumNS s]
467+typeImports s = sort ["Network.Google.Prelude", prodNS s, sumNS s]
445−prodImports s = ["Network.Google.Prelude", sumNS s]
468+prodImports s = sort ["Network.Google.Prelude", sumNS s]
446−sumImports _ = ["Network.Google.Prelude"]
469+sumImports _ = sort ["Network.Google.Prelude"]
470+actionImports = typeImports
448tocNS, typesNS, prodNS, sumNS :: Service s r -> NS
472tocNS, typesNS, prodNS, sumNS :: Service s r -> NS
449tocNS s = NS $ "Network" : "Google" : Text.split (== '.') (_svcCanonicalName s)
473tocNS s = NS $ "Network" : "Google" : Text.split (== '.') (_svcCanonicalName s)
@@ -451,11 +475,14 @@ typesNS = (<> "Types") . tocNS
451prodNS = (<> "Product") . typesNS
475prodNS = (<> "Product") . typesNS
452sumNS = (<> "Sum") . typesNS
476sumNS = (<> "Sum") . typesNS
454−exposedModules :: Service s r -> [NS]
478+actionNS :: Service s r -> Local -> Local -> NS
455−exposedModules s = [tocNS s, typesNS s]
479+actionNS s x y = tocNS s <> NS [upperHead (local x), upperHead (local y)]
481+exposedModules :: Service s API -> [NS]
482+exposedModules s = sort (tocNS s : typesNS s : svcActions s)
457otherModules :: Service s r -> [NS]
484otherModules :: Service s r -> [NS]
458−otherModules s = [prodNS s, sumNS s]
485+otherModules s = sort [prodNS s, sumNS s]
460data Library = Library
487data Library = Library
461 { _libName :: Text
488 { _libName :: Text