{-# LANGUAGE OverloadedStrings #-}

module Distribution.Nixpkgs.Haskell.FromCabal.Normalize ( normalize ) where

import Control.Lens
import qualified Data.Set as Set
import Data.String
import Distribution.Nixpkgs.Haskell
import Distribution.Nixpkgs.Meta
import Distribution.Package
import Language.Nix hiding ( quote )

normalize :: Derivation -> Derivation
normalize :: Derivation -> Derivation
normalize Derivation
drv = Derivation
drv
  forall a b. a -> (a -> b) -> b
& forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over Lens' Derivation BuildInfo
libraryDepends (PackageName -> BuildInfo -> BuildInfo
normalizeBuildInfo (forall pkg. Package pkg => pkg -> PackageName
packageName Derivation
drv))
  forall a b. a -> (a -> b) -> b
& forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over Lens' Derivation BuildInfo
executableDepends (PackageName -> BuildInfo -> BuildInfo
normalizeBuildInfo (forall pkg. Package pkg => pkg -> PackageName
packageName Derivation
drv))
  forall a b. a -> (a -> b) -> b
& forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over Lens' Derivation BuildInfo
testDepends (PackageName -> BuildInfo -> BuildInfo
normalizeBuildInfo (forall pkg. Package pkg => pkg -> PackageName
packageName Derivation
drv))
  forall a b. a -> (a -> b) -> b
& forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over Lens' Derivation BuildInfo
benchmarkDepends (PackageName -> BuildInfo -> BuildInfo
normalizeBuildInfo (forall pkg. Package pkg => pkg -> PackageName
packageName Derivation
drv))
  forall a b. a -> (a -> b) -> b
& forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over Lens' Derivation Meta
metaSection Meta -> Meta
normalizeMeta
  forall a b. a -> (a -> b) -> b
& Lens' Derivation Bool
jailbreak forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (Bool -> Bool -> Bool
&& (forall pkg. Package pkg => pkg -> PackageName
packageName Derivation
drv forall a. Eq a => a -> a -> Bool
/= PackageName
"jailbreak-cabal"))

normalizeBuildInfo :: PackageName -> BuildInfo -> BuildInfo
normalizeBuildInfo :: PackageName -> BuildInfo -> BuildInfo
normalizeBuildInfo PackageName
pname BuildInfo
bi = BuildInfo
bi
  forall a b. a -> (a -> b) -> b
& Lens' BuildInfo (Set Binding)
haskell forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall a. (a -> Bool) -> Set a -> Set a
Set.filter (\Binding
b -> forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' Binding Identifier
localName Binding
b forall a. Eq a => a -> a -> Bool
/= forall a. IsString a => String -> a
fromString (PackageName -> String
unPackageName PackageName
pname))
  forall a b. a -> (a -> b) -> b
& Lens' BuildInfo (Set Binding)
tool forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall a. (a -> Bool) -> Set a -> Set a
Set.filter (\Binding
b -> forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' Binding Identifier
localName Binding
b forall a. Eq a => a -> a -> Bool
/= forall a. IsString a => String -> a
fromString (PackageName -> String
unPackageName PackageName
pname))

normalizeMeta :: Meta -> Meta
normalizeMeta :: Meta -> Meta
normalizeMeta Meta
meta = Meta
meta
  forall a b. a -> (a -> b) -> b
& Lens' Meta String
description forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ String -> String
normalizeSynopsis
  forall a b. a -> (a -> b) -> b
& Lens' Meta (Maybe (Set NixpkgsPlatform))
hydraPlatforms forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ (if Meta
metaforall s a. s -> Getting a s a -> a
^.Lens' Meta Bool
broken then forall a b. a -> b -> a
const (forall a. a -> Maybe a
Just forall a. Set a
Set.empty) else forall a. a -> a
id)

normalizeSynopsis :: String -> String
normalizeSynopsis :: String -> String
normalizeSynopsis String
desc
  | forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
desc                                             = []
  | forall a. [a] -> a
last String
desc forall a. Eq a => a -> a -> Bool
== Char
'.' Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Int
length (forall a. (a -> Bool) -> [a] -> [a]
filter (Char
'.'forall a. Eq a => a -> a -> Bool
==) String
desc) forall a. Eq a => a -> a -> Bool
== Int
1 = String -> String
normalizeSynopsis (forall a. [a] -> [a]
init String
desc)
  | Bool
otherwise                                             = String -> String
quote ([String] -> String
unwords (String -> [String]
words String
desc))

quote :: String -> String
quote :: String -> String
quote (Char
'\\':Char
c:String
cs) = Char
'\\' forall a. a -> [a] -> [a]
: Char
c forall a. a -> [a] -> [a]
: String -> String
quote String
cs
quote (Char
'"':String
cs)    = Char
'\\' forall a. a -> [a] -> [a]
: Char
'"' forall a. a -> [a] -> [a]
: String -> String
quote String
cs
quote (Char
c:String
cs)      = Char
c forall a. a -> [a] -> [a]
: String -> String
quote String
cs
quote []          = []