@@ -6,12 +6,13 @@ module BraveSearch
6
6
) where
7
7
8
8
import Network.HTTP.Simple
9
+ import Data.Text.Encoding (encodeUtf8 )
9
10
import Data.Aeson
10
11
import qualified Data.Text as T
11
12
import Control.Exception (try )
12
13
import Network.HTTP.Client (HttpException )
13
14
import qualified Data.ByteString.Char8 as BS
14
- import qualified Data.ByteString.Lazy.Char8 as LBS
15
+ -- removed unused import Data.ByteString.Lazy.Char8
15
16
16
17
data SearchResponse = SearchResponse
17
18
{ query :: QueryInfo
@@ -57,32 +58,39 @@ instance FromJSON WebResult where
57
58
<*> v .:? " url"
58
59
<*> v .:? " description"
59
60
60
- getSearchSuggestions :: String -> String -> IO (Either String [T. Text ])
61
+ -- | Perform a Brave Search with the given API key (as raw bytes) and text query.
62
+ getSearchSuggestions :: BS. ByteString -> T. Text -> IO (Either T. Text [T. Text ])
61
63
getSearchSuggestions apiKey query = do
62
- let url = " https://api.search.brave.com/res/v1/web/search?q=" ++ query ++ " &country=US&count=5"
63
-
64
- request <- parseRequest url
65
- let requestWithHeaders = setRequestHeader " Accept" [" application/json" ]
66
- $ setRequestHeader " X-Subscription-Token" [BS. pack apiKey]
67
- $ request
68
-
69
- result <- try $ httpLBS requestWithHeaders
70
-
64
+ -- Build base request
65
+ let baseUrl = " https://api.search.brave.com/res/v1/web/search"
66
+ request0 <- parseRequest baseUrl
67
+ -- Add query parameters (URL-encoded) and headers
68
+ let request1 = setRequestQueryString
69
+ [ (" q" , Just $ encodeUtf8 query)
70
+ , (" country" , Just " US" )
71
+ , (" count" , Just " 5" )
72
+ ]
73
+ request0
74
+ request = setRequestHeader " Accept" [" application/json" ]
75
+ $ setRequestHeader " X-Subscription-Token" [apiKey]
76
+ $ request1
77
+
78
+ result <- try $ httpLBS request
79
+
71
80
case result of
72
- Left e -> return $ Left $ " Network error: " ++ show (e :: HttpException )
73
- Right response -> do
74
- let statusCode = getResponseStatusCode response
75
- if statusCode /= 200
76
- then return $ Left $ " HTTP error: " ++ show statusCode
77
- else do
78
- let body = getResponseBody response
79
- case eitherDecode body of
80
- Left err -> return $ Left $ " JSON parsing error: " ++ err
81
- Right searchResponse@ SearchResponse {.. } -> do
82
- let originalQuery = original query
83
- webResults = results web
84
- let suggestions = " Original Query: " <> originalQuery : map formatResult webResults
85
- return $ Right suggestions
81
+ Left e -> return . Left $ T. pack $ " Network error: " ++ show (e :: HttpException )
82
+ Right response ->
83
+ let status = getResponseStatusCode response
84
+ in if status /= 200
85
+ then return . Left $ T. pack $ " HTTP error: " ++ show status
86
+ else case eitherDecode (getResponseBody response) of
87
+ Left err -> return . Left $ T. pack $ " JSON parsing error: " ++ err
88
+ Right SearchResponse {.. } ->
89
+ let originalQuery = original query
90
+ webResults = results web
91
+ suggestions = (" Original Query: " <> originalQuery)
92
+ : map formatResult webResults
93
+ in return $ Right suggestions
86
94
87
95
formatResult :: WebResult -> T. Text
88
96
formatResult WebResult {.. } =
0 commit comments