@@ -12,6 +12,7 @@ import Control.Monad (mzero)
12
12
import Control.Monad.Trans (liftIO )
13
13
import Data.Aeson (FromJSON (.. ), Value (.. ), (.:) )
14
14
import Data.ByteString (ByteString )
15
+ import qualified Data.ByteString.Char8 as BC
15
16
16
17
17
18
--------------------------------------------------------------------------------
@@ -28,10 +29,28 @@ data HackerNews = HackerNews [Item] deriving (Show)
28
29
29
30
--------------------------------------------------------------------------------
30
31
instance FromJSON HackerNews where
31
- parseJSON (Object o) = HackerNews <$> o .: " items"
32
+ parseJSON (Object o) = resolveSelfPosts . HackerNews <$> o .: " items"
32
33
parseJSON _ = mzero
33
34
34
35
36
+ --------------------------------------------------------------------------------
37
+ -- | Make an URLs in items absolute if needed
38
+ --
39
+ -- The HN api returns
40
+ --
41
+ -- > /comments/1234
42
+ --
43
+ -- as URL for these links, and we need
44
+ --
45
+ -- > http://news.ycombinator.com/item?id=1234
46
+ resolveSelfPosts :: HackerNews -> HackerNews
47
+ resolveSelfPosts (HackerNews items) = HackerNews $ map resolve items
48
+ where
49
+ resolve (Item title url) = Item title $ case (BC. split ' /' url) of
50
+ [" " , " comments" , nr] -> " http://news.ycombinator.com/item?id=" <> nr
51
+ _ -> url
52
+
53
+
35
54
--------------------------------------------------------------------------------
36
55
data Item = Item ByteString ByteString deriving (Show )
37
56
@@ -50,7 +69,7 @@ hackerNews query = do
50
69
Right (HackerNews items) ->
51
70
let Item title url = items !! idx
52
71
in textAndUrl title url
53
- _ -> return " Something went wrong "
72
+ _ -> return " Error: data center on fire "
54
73
where
55
74
idx = case readByteString query of
56
75
Just n -> n - 1
0 commit comments