36 lines
1.2 KiB
Haskell
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 "\""
|