@@ -1,6 +1,7 @@
1{-# LANGUAGE RecordWildCards #-}
1{-# LANGUAGE RecordWildCards #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3{-# LANGUAGE TupleSections #-}
3{-# LANGUAGE TupleSections #-}
4+{-# LANGUAGE RankNTypes #-}
5module Language.PureScript.Docs.Types
6module Language.PureScript.Docs.Types
6 ( module Language.PureScript.Docs.Types
7 ( module Language.PureScript.Docs.Types
@@ -10,6 +11,7 @@ module Language.PureScript.Docs.Types
11import Control.Arrow (first, (***))
12import Control.Arrow (first, (***))
12import Control.Applicative ((<$>), (<*>))
13import Control.Applicative ((<$>), (<*>))
14+import Data.Functor ((<$))
13import Data.Char
15import Data.Char
14import Data.Maybe (mapMaybe)
16import Data.Maybe (mapMaybe)
15import Data.Version
17import Data.Version
@@ -18,6 +20,7 @@ import qualified Data.Aeson as A
18import Data.Aeson.BetterErrors
20import Data.Aeson.BetterErrors
19import Text.ParserCombinators.ReadP (readP_to_S)
21import Text.ParserCombinators.ReadP (readP_to_S)
20import Data.Text (Text)
22import Data.Text (Text)
23+import Data.ByteString.Lazy (ByteString)
21import qualified Data.Text as T
24import qualified Data.Text as T
23import Web.Bower.PackageMeta hiding (Version)
26import Web.Bower.PackageMeta hiding (Version)
@@ -32,17 +35,35 @@ import Language.PureScript.Docs.RenderedCode as ReExports
32--------------------
35--------------------
35−data UploadedPackage = UploadedPackage
38+data Package a = Package
36 { pkgMeta :: PackageMeta
39 { pkgMeta :: PackageMeta
37 , pkgVersion :: Version
40 , pkgVersion :: Version
38 , pkgModules :: [RenderedModule]
41 , pkgModules :: [RenderedModule]
39 , pkgBookmarks :: [Bookmark]
42 , pkgBookmarks :: [Bookmark]
40 , pkgResolvedDependencies :: [(PackageName, Version)]
43 , pkgResolvedDependencies :: [(PackageName, Version)]
41 , pkgGithub :: (GithubUser, GithubRepo)
44 , pkgGithub :: (GithubUser, GithubRepo)
42− , pkgUploader :: Maybe GithubUser
45+ , pkgUploader :: a
44 deriving (Show, Eq, Ord)
47 deriving (Show, Eq, Ord)
49+data NotYetKnown = NotYetKnown
51+type UploadedPackage = Package NotYetKnown
52+type VerifiedPackage = Package GithubUser
54+verifyPackage :: GithubUser -> UploadedPackage -> VerifiedPackage
55+verifyPackage verifiedUser Package{..} =
60+ pkgResolvedDependencies
64+packageName :: Package a -> PackageName
65+packageName = bowerName . pkgMeta
46data RenderedModule = RenderedModule
67data RenderedModule = RenderedModule
47 { rmName :: String
68 { rmName :: String
48 , rmComments :: Maybe String
69 , rmComments :: Maybe String
@@ -92,7 +113,7 @@ newtype GithubRepo
92 = GithubRepo { runGithubRepo :: String }
113 = GithubRepo { runGithubRepo :: String }
93 deriving (Show, Eq, Ord)
114 deriving (Show, Eq, Ord)
95−data UploadedPackageError
116+data PackageError
96 = ErrorInPackageMeta BowerError
117 = ErrorInPackageMeta BowerError
97 | InvalidVersion
118 | InvalidVersion
98 | InvalidDeclarationType
119 | InvalidDeclarationType
@@ -124,17 +145,46 @@ ignorePackage (FromDep _ x) = x
124----------------------
145----------------------
125-- Parsing
146-- Parsing
127−asUploadedPackage :: Parse UploadedPackageError UploadedPackage
148+parseUploadedPackage :: ByteString -> Either (ParseError PackageError) UploadedPackage
128−asUploadedPackage =
149+parseUploadedPackage = parse asUploadedPackage
151+parseVerifiedPackage :: ByteString -> Either (ParseError PackageError) VerifiedPackage
152+parseVerifiedPackage = parse asVerifiedPackage
154+asPackage :: (forall e. Parse e a) -> Parse PackageError (Package a)
129− UploadedPackage <$> key "packageMeta" asPackageMeta .! ErrorInPackageMeta
156+ Package <$> key "packageMeta" asPackageMeta .! ErrorInPackageMeta
130− <*> key "version" asVersion
157+ <*> key "version" asVersion
131− <*> key "modules" (eachInArray asRenderedModule)
158+ <*> key "modules" (eachInArray asRenderedModule)
132− <*> key "bookmarks" asBookmarks .! ErrorInPackageMeta
159+ <*> key "bookmarks" asBookmarks .! ErrorInPackageMeta
133− <*> key "resolvedDependencies" asResolvedDependencies
160+ <*> key "resolvedDependencies" asResolvedDependencies
134− <*> key "github" asGithub
161+ <*> key "github" asGithub
162+ <*> key "uploader" uploader
164+asUploadedPackage :: Parse PackageError UploadedPackage
165+asUploadedPackage = asPackage asNotYetKnown
167+asNotYetKnown :: Parse e NotYetKnown
168+asNotYetKnown = NotYetKnown <$ asNull
170+instance A.FromJSON NotYetKnown where
171+ parseJSON = toAesonParser' asNotYetKnown
173+asVerifiedPackage :: Parse PackageError VerifiedPackage
174+asVerifiedPackage = asPackage asGithubUser
176+asGithubUser :: Parse e GithubUser
135− <*> keyMay "uploader" (GithubUser <$> asString)
177+asGithubUser = GithubUser <$> asString
179+instance A.FromJSON GithubUser where
180+ parseJSON = toAesonParser' asGithubUser
182+instance A.FromJSON a => A.FromJSON (Package a) where
183+ -- TODO: actual error display
184+ parseJSON = toAesonParser (T.pack . show)
185+ (asPackage fromAesonParser)
137−asVersion :: Parse UploadedPackageError Version
187+asVersion :: Parse PackageError Version
138asVersion = withString (maybe (Left InvalidVersion) Right . parseVersion')
188asVersion = withString (maybe (Left InvalidVersion) Right . parseVersion')
140parseVersion' :: String -> Maybe Version
190parseVersion' :: String -> Maybe Version
@@ -143,13 +193,13 @@ parseVersion' str =
143 [(vers, "")] -> Just vers
193 [(vers, "")] -> Just vers
144 _ -> Nothing
194 _ -> Nothing
146−asRenderedModule :: Parse UploadedPackageError RenderedModule
196+asRenderedModule :: Parse PackageError RenderedModule
147asRenderedModule =
197asRenderedModule =
148 RenderedModule <$> key "name" asString
198 RenderedModule <$> key "name" asString
149 <*> key "comments" (perhaps asString)
199 <*> key "comments" (perhaps asString)
150 <*> key "declarations" (eachInArray asDeclaration)
200 <*> key "declarations" (eachInArray asDeclaration)
152−asDeclaration :: Parse UploadedPackageError RenderedDeclaration
202+asDeclaration :: Parse PackageError RenderedDeclaration
153asDeclaration =
203asDeclaration =
154 RenderedDeclaration <$> key "title" asString
204 RenderedDeclaration <$> key "title" asString
155 <*> key "comments" (perhaps asString)
205 <*> key "comments" (perhaps asString)
@@ -157,7 +207,7 @@ asDeclaration =
157 <*> key "sourceSpan" (perhaps asSourceSpan)
207 <*> key "sourceSpan" (perhaps asSourceSpan)
158 <*> key "children" (eachInArray asRenderedChildDeclaration)
208 <*> key "children" (eachInArray asRenderedChildDeclaration)
160−asRenderedChildDeclaration :: Parse UploadedPackageError RenderedChildDeclaration
210+asRenderedChildDeclaration :: Parse PackageError RenderedChildDeclaration
161asRenderedChildDeclaration =
211asRenderedChildDeclaration =
162 RenderedChildDeclaration <$> key "title" asString
212 RenderedChildDeclaration <$> key "title" asString
163 <*> key "comments" (perhaps asString)
213 <*> key "comments" (perhaps asString)
@@ -167,7 +217,7 @@ asRenderedChildDeclaration =
168 p .!! err = p .! const err
218 p .!! err = p .! const err
170−asRenderedChildDeclarationType :: Parse UploadedPackageError RenderedChildDeclarationType
220+asRenderedChildDeclarationType :: Parse PackageError RenderedChildDeclarationType
171asRenderedChildDeclarationType =
221asRenderedChildDeclarationType =
172 withString (maybe (Left InvalidDeclarationType) Right .
222 withString (maybe (Left InvalidDeclarationType) Right .
173 flip lookup childDeclarationTypes)
223 flip lookup childDeclarationTypes)
@@ -188,7 +238,7 @@ asBookmark =
188 build Nothing = Local
238 build Nothing = Local
189 build (Just pn) = FromDep pn
239 build (Just pn) = FromDep pn
191−asResolvedDependencies :: Parse UploadedPackageError [(PackageName, Version)]
241+asResolvedDependencies :: Parse PackageError [(PackageName, Version)]
192asResolvedDependencies =
242asResolvedDependencies =
193 eachInObjectWithKey (mapLeft ErrorInPackageMeta . parsePackageName . T.unpack) asVersion
243 eachInObjectWithKey (mapLeft ErrorInPackageMeta . parsePackageName . T.unpack) asVersion
@@ -207,8 +257,8 @@ asSourceSpan = P.SourceSpan <$> key "name" asString
207---------------------
257---------------------
208-- ToJSON instances
258-- ToJSON instances
210−instance A.ToJSON UploadedPackage where
260+instance A.ToJSON a => A.ToJSON (Package a) where
211− toJSON UploadedPackage{..} =
261+ toJSON Package{..} =
212 A.object $
262 A.object $
213 [ "packageMeta" .= pkgMeta
263 [ "packageMeta" .= pkgMeta
214 , "version" .= showVersion pkgVersion
264 , "version" .= showVersion pkgVersion
@@ -218,9 +268,11 @@ instance A.ToJSON UploadedPackage where
218 (T.pack . showVersion)
268 (T.pack . showVersion)
219 pkgResolvedDependencies
269 pkgResolvedDependencies
220 , "github" .= pkgGithub
270 , "github" .= pkgGithub
221− ] ++ case pkgUploader of
271+ , "uploader" .= pkgUploader
222− Just u -> [ "uploader" .= u ]
272+ ]
274+instance A.ToJSON NotYetKnown where
225instance A.ToJSON RenderedModule where
277instance A.ToJSON RenderedModule where
226 toJSON RenderedModule{..} =
278 toJSON RenderedModule{..} =