nix-attr-search/internals/json2nix/json2nix.hs

36 lines
1.2 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson (Value(..), decode)
import Data.Aeson.Key (Key, toString)
import Data.Aeson.KeyMap (foldMapWithKey)
import Data.Aeson.Parser (json')
import Data.Aeson.Types (parse)
import Data.String (fromString)
import Data.Text (Text(..), unpack, replace, isInfixOf)
import Data.Vector (Vector)
import Data.Maybe (fromMaybe)
main :: IO ()
main = interact f
where
f input = case decode $ fromString input of
Nothing -> "json2nix error - could not parse input\n" ++ show input
Just jsonValue -> json2Nix jsonValue
keyValToString :: Key -> Value -> String
keyValToString key value = toString key ++ " = " ++ json2Nix value ++ ";"
-- escapeDollar :: Text -> Text
-- escapeDollar = replace "''${" "\\''${"
json2Nix :: Value -> String
json2Nix (Object object) = "{" ++ foldMapWithKey keyValToString object ++ "}"
json2Nix (Array array) = "[" ++ foldr (\x y -> x ++ " " ++ y) "" (fmap json2Nix array) ++ "]"
json2Nix (Number n) = show n
json2Nix (Bool False) = "false"
json2Nix (Bool True) = "true"
json2Nix Null = "null"
json2Nix (String text) = sep ++ unpack text ++ sep
where
sep = if "\"" `isInfixOf` text then "\'\'" else "\""