From a8f5ead1ca1f3cd9e0d8e4de3b0e4e5193627e98 Mon Sep 17 00:00:00 2001 From: Lia Lenckowski Date: Sat, 22 Jul 2023 20:52:40 +0200 Subject: parse ddg's bangs --- src/Bangs.hs | 19 +++++++++++++++++++ src/Main.hs | 21 +++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/Bangs.hs create mode 100644 src/Main.hs (limited to 'src') diff --git a/src/Bangs.hs b/src/Bangs.hs new file mode 100644 index 0000000..017d03b --- /dev/null +++ b/src/Bangs.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Bangs (Bangs) where + +import Data.Aeson +import Data.Aeson.Types (Parser) +import Data.Text (Text) +import qualified Data.Map.Strict as M + +-- The map stored is equivalent to `HM.HashMap Shortcut URL`. +-- For now, we're omitting category information as I don't want to force our +-- own custom bangs to need that info. +data Bangs = Bangs (M.Map Text Text) deriving (Show) +instance FromJSON Bangs where + parseJSON b = fmap (Bangs . M.fromList) $ + (parseJSON b :: Parser [Value]) + >>= mapM (withObject "Bang" $ \ob -> + (,) <$> ob .: "t" <*> ob .: "u") + diff --git a/src/Main.hs b/src/Main.hs new file mode 100644 index 0000000..997bbf5 --- /dev/null +++ b/src/Main.hs @@ -0,0 +1,21 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Main (main) where + +import Yesod +import Data.ByteString (ByteString) +import Data.IORef +import Network.HTTP.Simple + +import Bangs + +data Search = Search { + ddgBangs :: IORef Bangs, + ownBangs :: IORef Bangs, + serializedBangs :: IORef ByteString +} + +main :: IO () +main = do + ans <- (httpJSON "https://duckduckgo.com/bang.v255.js") :: IO (Response Bangs) + print ans -- cgit v1.2.3-70-g09d2