@@ -13,20 +13,25 @@
1313
1414module Gen.Types where
1515
16+--import Control.Lens
1617import Data.Aeson
1718import Data.Aeson.TH
1819import qualified Data.Attoparsec.Text as A
1920import Data.Char
2021import Data.Function (on)
2122import qualified Data.HashMap.Strict as Map
22−import Data.List (nub, sort)
23−import Data.Monoid
23+import Data.List (groupBy, nub, sort)
24+import Data.List.NonEmpty (NonEmpty (..), nonEmpty)
25+import qualified Data.List.NonEmpty as NE
2426import Data.Ord
27+import Data.Semigroup
2528import Data.Text (Text)
2629import qualified Data.Text as Text
2730import qualified Data.Text.Lazy as LText
31+import Data.Text.Manipulate
2832import qualified Filesystem.Path.CurrentOS as Path
2933import Gen.JSON
34+import Gen.Types.NS
3035import GHC.TypeLits
3136import Text.EDE (Template)
3237
@@ -58,6 +63,8 @@ data Versions = Versions
5863 , _coreVersion :: CoreVer
5964 } deriving (Show)
6065
66+-- makeClassy ''Versions
67+
6168-- FIXME: need a more comprehensive 'vm_alpha' vs 'vm1.1' etc check.
6269data Spec = Spec
6370 { _specName :: Text
@@ -96,20 +103,15 @@ instance FromJSON Protocol where
96103 e -> fail $ "Unable to parse protocol from " ++ Text.unpack e
97104
98105data Service = Service
99− { _svcKind :: Text
100− , _svcEtag :: Text
101− , _svcDiscoveryVersion :: Text
102− , _svcId :: Text
106+ { _svcTitle :: Text
103107 , _svcName :: Text
104108 , _svcCanonicalName :: Maybe Text
105− , _svcTitle :: Text
106− , _svcVersion :: Text
107− , _svcRevision :: Maybe Text
108109 , _svcDescription :: Text
109− , _svcOwnerDomain :: Text
110+ , _svcRevision :: Maybe Text
111+ , _svcVersion :: Text
110112 , _svcOwnerName :: Text
113+ , _svcOwnerDomain :: Text
111114 , _svcPackagePath :: Maybe Text
112− , _svcIcons :: Object
113115 , _svcDocumentationLink :: Text
114116 , _svcProtocol :: Protocol
115117 , _svcBaseUrl :: Text
@@ -122,3 +124,27 @@ data Service = Service
122124 } deriving (Show)
123125
124126deriveFromJSON (js "_svc") ''Service
127+
128+data Library = Library
129+ { _libName :: Text
130+ , _libTitle :: Text
131+ , _libDescriptions :: [Text]
132+ , _libNamespace :: NS
133+ , _libVersions :: Versions
134+ , _libServices :: NonEmpty Service
135+ }
136+
137+mergeLibraries :: Versions -> [Service] -> [Library]
138+mergeLibraries v = map go . groupBy (on (==) _svcName)
139+ where
140+ go [x] = mk x
141+ go (x:xs) = (mk x) { _libServices = x :| xs }
142+
143+ mk x = Library
144+ { _libName = "gozen-" <> Text.toLower (_svcName x)
145+ , _libTitle = _svcTitle x
146+ , _libDescriptions = []
147+ , _libNamespace = "Network.Google" <> mkNS (toPascal (_svcName x))
148+ , _libVersions = v
149+ , _libServices = x :| []
150+ }