-- |
-- Module: Staversion.Internal.Query
-- Description: Query, Result and related symbols.
-- Maintainer: Toshio Ito <debug.ito@gmail.com>
--
-- __This is an internal module. End-users should not use it.__
module Staversion.Internal.Query
       ( PackageName,
         Resolver,
         PackageSource(..),
         sourceDesc,
         Query(..),
         parseQuery,
         ErrorMsg
       ) where

import Data.List (isSuffixOf)
import Data.Text (Text, pack)

type PackageName = Text

-- | Resolver name at stackage like "lts-4.1".
type Resolver = String

-- | Source of packages.
data PackageSource = SourceStackage Resolver -- ^ stackage.
                   | SourceHackage -- ^ hackage (latest)
                   | SourceStackYaml FilePath
                     -- ^ stack.yaml file. Its \"resolver\" field is
                     -- used as the package source.
                   | SourceStackDefault
                     -- ^ the resolver that the @stack@ command would
                     -- use by default.
                   deriving (Int -> PackageSource -> ShowS
[PackageSource] -> ShowS
PackageSource -> String
(Int -> PackageSource -> ShowS)
-> (PackageSource -> String)
-> ([PackageSource] -> ShowS)
-> Show PackageSource
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PackageSource] -> ShowS
$cshowList :: [PackageSource] -> ShowS
show :: PackageSource -> String
$cshow :: PackageSource -> String
showsPrec :: Int -> PackageSource -> ShowS
$cshowsPrec :: Int -> PackageSource -> ShowS
Show,PackageSource -> PackageSource -> Bool
(PackageSource -> PackageSource -> Bool)
-> (PackageSource -> PackageSource -> Bool) -> Eq PackageSource
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PackageSource -> PackageSource -> Bool
$c/= :: PackageSource -> PackageSource -> Bool
== :: PackageSource -> PackageSource -> Bool
$c== :: PackageSource -> PackageSource -> Bool
Eq,Eq PackageSource
Eq PackageSource
-> (PackageSource -> PackageSource -> Ordering)
-> (PackageSource -> PackageSource -> Bool)
-> (PackageSource -> PackageSource -> Bool)
-> (PackageSource -> PackageSource -> Bool)
-> (PackageSource -> PackageSource -> Bool)
-> (PackageSource -> PackageSource -> PackageSource)
-> (PackageSource -> PackageSource -> PackageSource)
-> Ord PackageSource
PackageSource -> PackageSource -> Bool
PackageSource -> PackageSource -> Ordering
PackageSource -> PackageSource -> PackageSource
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PackageSource -> PackageSource -> PackageSource
$cmin :: PackageSource -> PackageSource -> PackageSource
max :: PackageSource -> PackageSource -> PackageSource
$cmax :: PackageSource -> PackageSource -> PackageSource
>= :: PackageSource -> PackageSource -> Bool
$c>= :: PackageSource -> PackageSource -> Bool
> :: PackageSource -> PackageSource -> Bool
$c> :: PackageSource -> PackageSource -> Bool
<= :: PackageSource -> PackageSource -> Bool
$c<= :: PackageSource -> PackageSource -> Bool
< :: PackageSource -> PackageSource -> Bool
$c< :: PackageSource -> PackageSource -> Bool
compare :: PackageSource -> PackageSource -> Ordering
$ccompare :: PackageSource -> PackageSource -> Ordering
$cp1Ord :: Eq PackageSource
Ord)

-- | Query for package version(s).
data Query = QueryName PackageName
           | QueryCabalFile FilePath
           | QueryStackYaml FilePath
           | QueryStackYamlDefault
           deriving (Int -> Query -> ShowS
[Query] -> ShowS
Query -> String
(Int -> Query -> ShowS)
-> (Query -> String) -> ([Query] -> ShowS) -> Show Query
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Query] -> ShowS
$cshowList :: [Query] -> ShowS
show :: Query -> String
$cshow :: Query -> String
showsPrec :: Int -> Query -> ShowS
$cshowsPrec :: Int -> Query -> ShowS
Show,Query -> Query -> Bool
(Query -> Query -> Bool) -> (Query -> Query -> Bool) -> Eq Query
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Query -> Query -> Bool
$c/= :: Query -> Query -> Bool
== :: Query -> Query -> Bool
$c== :: Query -> Query -> Bool
Eq,Eq Query
Eq Query
-> (Query -> Query -> Ordering)
-> (Query -> Query -> Bool)
-> (Query -> Query -> Bool)
-> (Query -> Query -> Bool)
-> (Query -> Query -> Bool)
-> (Query -> Query -> Query)
-> (Query -> Query -> Query)
-> Ord Query
Query -> Query -> Bool
Query -> Query -> Ordering
Query -> Query -> Query
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Query -> Query -> Query
$cmin :: Query -> Query -> Query
max :: Query -> Query -> Query
$cmax :: Query -> Query -> Query
>= :: Query -> Query -> Bool
$c>= :: Query -> Query -> Bool
> :: Query -> Query -> Bool
$c> :: Query -> Query -> Bool
<= :: Query -> Query -> Bool
$c<= :: Query -> Query -> Bool
< :: Query -> Query -> Bool
$c< :: Query -> Query -> Bool
compare :: Query -> Query -> Ordering
$ccompare :: Query -> Query -> Ordering
$cp1Ord :: Eq Query
Ord)

type ErrorMsg = String

-- | description of a 'PackageSource'.
sourceDesc :: PackageSource -> Text
sourceDesc :: PackageSource -> Text
sourceDesc (SourceStackage String
r) = String -> Text
pack String
r
sourceDesc PackageSource
SourceHackage = Text
"latest in hackage"
sourceDesc (SourceStackYaml String
p) = String -> Text
pack String
p
sourceDesc PackageSource
SourceStackDefault = Text
"default stack resolver"

parseQuery :: String -> Query
parseQuery :: String -> Query
parseQuery String
s =
  if String
s String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"stack.yaml"
  then Query
QueryStackYamlDefault
  else if String
"stack.yaml" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
s
       then String -> Query
QueryStackYaml String
s
       else if String
".cabal" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
s
            then String -> Query
QueryCabalFile String
s
            else Text -> Query
QueryName (Text -> Query) -> Text -> Query
forall a b. (a -> b) -> a -> b
$ String -> Text
pack String
s