{-# LANGUAGE OverloadedStrings #-} module Hie.Yaml ( hieYaml, fmtComponent, fmtPkgs, cabalComponent, stackComponent, ) where import qualified Data.Text as T import Hie.Cabal.Parser hieYaml :: String -> String -> String hieYaml sOrC pkgs = "cradle:\n" <> indent' (sOrC <> ":\n" <> indent' pkgs) indent' :: String -> String indent' = unlines . map ( \l -> case l of "" -> "" _ -> " " <> l ) . lines cabalComponent :: Name -> Component -> (FilePath, String) cabalComponent n (Comp Lib "" p) = (T.unpack p, T.unpack $ "lib:" <> n) cabalComponent n (Comp Lib cn p) = (T.unpack p, T.unpack $ n <> ":lib:" <> cn) cabalComponent n (Comp Exe cn p) = (T.unpack p, T.unpack $ n <> ":exe:" <> cn) cabalComponent n (Comp Bench cn p) = (T.unpack p, T.unpack $ n <> ":bench:" <> cn) cabalComponent n (Comp Test cn p) = (T.unpack p, T.unpack $ n <> ":test:" <> cn) stackComponent :: Name -> Component -> (FilePath, String) stackComponent n (Comp Lib "" p) = (T.unpack p, T.unpack $ n <> ":lib") stackComponent n (Comp Lib cn p) = (T.unpack p, T.unpack $ n <> ":lib:" <> cn) stackComponent n (Comp Exe cn p) = (T.unpack p, T.unpack $ n <> ":exe:" <> cn) stackComponent n (Comp Bench cn p) = (T.unpack p, T.unpack $ n <> ":bench:" <> cn) stackComponent n (Comp Test cn p) = (T.unpack p, T.unpack $ n <> ":test:" <> cn) fmtComponent :: (FilePath, String) -> String fmtComponent (p, c) = "- path: " <> dQuote p <> "\n " <> "component: " <> dQuote c dropLast :: [a] -> [a] dropLast l = take (length l - 1) l fmtPkgs :: String -> [Package] -> String fmtPkgs sOrC pkgs = dropLast $ unlines l where comp = if sOrC == "cabal" then cabalComponent else stackComponent f (Package n cs) = map ((<> "\n") . fmtComponent . comp n) cs l = concatMap f pkgs dQuote :: String -> String dQuote t = '"' : t <> "\""