Skip to content

Commit 7aa52e6

Browse files
dylan-thinnesBinderDavid
authored andcommitted
Generate machine-readable spec in api/errors.json
1 parent ce45359 commit 7aa52e6

File tree

1 file changed

+44
-5
lines changed

1 file changed

+44
-5
lines changed

message-index/site.hs

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
{-# LANGUAGE ViewPatterns #-}
77

88
import qualified Data.Aeson as JSON
9+
import Data.Aeson ((.=))
910
import qualified Data.Aeson.KeyMap as KM
1011
import Data.Binary (Binary)
1112
import Data.Data (Typeable)
12-
import Data.Foldable (for_)
13+
import Data.Foldable (for_, foldl')
1314
import Data.Function (on)
1415
import Data.Functor ((<&>))
1516
import Data.List (find, lookup, nub, sort, sortBy, stripPrefix)
@@ -89,7 +90,7 @@ main = hakyll $ do
8990
match "messages/*/index.md" $ do
9091
route $ setExtension "html"
9192
compile $ do
92-
examples <- getExamples
93+
examples <- getExamples =<< getUnderlying
9394
let bread = breadcrumbCtx ["index.html"]
9495
pandocCompiler
9596
>>= loadAndApplyTemplate
@@ -142,6 +143,45 @@ main = hakyll $ do
142143

143144
match "templates/*" $ compile templateBodyCompiler
144145

146+
create ["api/errors.json"] $ do
147+
route idRoute
148+
compile $ do
149+
let exampleItemToJSON :: Item String -> Compiler JSON.Value
150+
exampleItemToJSON exampleItem = do
151+
meta <- getMetadata (itemIdentifier exampleItem)
152+
route <- getRoute (itemIdentifier exampleItem)
153+
let name =
154+
case splitDirectories $ toFilePath $ itemIdentifier exampleItem of
155+
["messages", _, name, "index.md"] -> name
156+
other -> error "is not an example"
157+
pure $ JSON.object
158+
[ "name" .= name
159+
, "route" .= route
160+
, "metadata" .= meta
161+
]
162+
163+
let errorItemToJSON :: Item String -> Compiler JSON.Value
164+
errorItemToJSON errorItem = do
165+
meta <- getMetadata (itemIdentifier errorItem)
166+
route <- getRoute (itemIdentifier errorItem)
167+
let code =
168+
case splitDirectories (toFilePath (itemIdentifier errorItem)) of
169+
["messages", code, "index.md"] -> code
170+
other -> error "is not a message"
171+
exampleItems <- getExamples (itemIdentifier errorItem)
172+
examples <- traverse exampleItemToJSON exampleItems
173+
pure $ JSON.object
174+
[ "code" .= code
175+
, "route" .= route
176+
, "metadata" .= meta
177+
, "examples" .= examples
178+
]
179+
180+
errorItems <- loadAll $ "messages/*/index.md" .&&. hasNoVersion
181+
encoded <- traverse errorItemToJSON errorItems
182+
makeItem $ JSON.encode encoded
183+
184+
145185
--------------------------------------------------------------------------------
146186

147187
-- | The file extensions to be shown in example lists
@@ -199,9 +239,8 @@ getIdentId ident =
199239
[_, x, _] -> Just x
200240
_ -> Nothing
201241

202-
getExamples :: Compiler [Item String]
203-
getExamples = do
204-
me <- getUnderlying
242+
getExamples :: Identifier -> Compiler [Item String]
243+
getExamples me = do
205244
code <- case splitDirectories $ toFilePath me of
206245
["messages", code, "index.md"] -> pure code
207246
other -> fail $ "Not processing a message: " ++ show other

0 commit comments

Comments
 (0)