module Hix.Managed.Build.NixOutput.Analysis where

import Distribution.Parsec (simpleParsec)
import Distribution.Simple (Dependency)

import qualified Hix.Data.Dep as Dep
import Hix.Data.Dep (Dep)

analyzeLog :: [Text] -> Maybe (NonEmpty Dep)
analyzeLog :: [Text] -> Maybe (NonEmpty Dep)
analyzeLog [Text]
log =
  [Dep] -> Maybe (NonEmpty Dep)
forall a. [a] -> Maybe (NonEmpty a)
nonEmpty [Dep]
bounds
  where
    bounds :: [Dep]
bounds = [Maybe Dep] -> [Dep]
forall a. [Maybe a] -> [a]
catMaybes ((Maybe Dep -> Bool) -> [Maybe Dep] -> [Maybe Dep]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile Maybe Dep -> Bool
forall a. Maybe a -> Bool
isJust (Text -> Maybe Dep
parseDep (Text -> Maybe Dep) -> [Text] -> [Maybe Dep]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Text]
afterBoundsMarker))
    afterBoundsMarker :: [Text]
afterBoundsMarker = Int -> [Text] -> [Text]
forall a. Int -> [a] -> [a]
drop Int
1 ((Text -> Bool) -> [Text] -> [Text]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Text
boundsMarker /=) [Text]
log)
    boundsMarker :: Text
boundsMarker = Text
"Error: Setup: Encountered missing or private dependencies:"
    parseDep :: Text -> Maybe Dep
parseDep = (Dependency -> Dep) -> Maybe Dependency -> Maybe Dep
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Dependency -> Dep
Dep.fromCabal (Maybe Dependency -> Maybe Dep)
-> (Text -> Maybe Dependency) -> Text -> Maybe Dep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Parsec a => String -> Maybe a
simpleParsec @Dependency (String -> Maybe Dependency)
-> (Text -> String) -> Text -> Maybe Dependency
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
forall a. ToString a => a -> String
toString