{-# LANGUAGE CPP #-}
module Nix.String.Coerce where
import Control.Monad.Catch ( MonadThrow )
import qualified Data.HashMap.Lazy as M
import Nix.Atoms
import Nix.Effects
import Nix.Frames
import Nix.String
import Nix.Value
import Nix.Value.Monad
#ifdef MIN_VERSION_ghc_datasize
import GHC.DataSize
#endif
data CoercionLevel
= CoerceStringy
| CoerceAny
deriving (CoercionLevel -> CoercionLevel -> Bool
(CoercionLevel -> CoercionLevel -> Bool)
-> (CoercionLevel -> CoercionLevel -> Bool) -> Eq CoercionLevel
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CoercionLevel -> CoercionLevel -> Bool
$c/= :: CoercionLevel -> CoercionLevel -> Bool
== :: CoercionLevel -> CoercionLevel -> Bool
$c== :: CoercionLevel -> CoercionLevel -> Bool
Eq,Eq CoercionLevel
Eq CoercionLevel
-> (CoercionLevel -> CoercionLevel -> Ordering)
-> (CoercionLevel -> CoercionLevel -> Bool)
-> (CoercionLevel -> CoercionLevel -> Bool)
-> (CoercionLevel -> CoercionLevel -> Bool)
-> (CoercionLevel -> CoercionLevel -> Bool)
-> (CoercionLevel -> CoercionLevel -> CoercionLevel)
-> (CoercionLevel -> CoercionLevel -> CoercionLevel)
-> Ord CoercionLevel
CoercionLevel -> CoercionLevel -> Bool
CoercionLevel -> CoercionLevel -> Ordering
CoercionLevel -> CoercionLevel -> CoercionLevel
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 :: CoercionLevel -> CoercionLevel -> CoercionLevel
$cmin :: CoercionLevel -> CoercionLevel -> CoercionLevel
max :: CoercionLevel -> CoercionLevel -> CoercionLevel
$cmax :: CoercionLevel -> CoercionLevel -> CoercionLevel
>= :: CoercionLevel -> CoercionLevel -> Bool
$c>= :: CoercionLevel -> CoercionLevel -> Bool
> :: CoercionLevel -> CoercionLevel -> Bool
$c> :: CoercionLevel -> CoercionLevel -> Bool
<= :: CoercionLevel -> CoercionLevel -> Bool
$c<= :: CoercionLevel -> CoercionLevel -> Bool
< :: CoercionLevel -> CoercionLevel -> Bool
$c< :: CoercionLevel -> CoercionLevel -> Bool
compare :: CoercionLevel -> CoercionLevel -> Ordering
$ccompare :: CoercionLevel -> CoercionLevel -> Ordering
$cp1Ord :: Eq CoercionLevel
Ord,Int -> CoercionLevel
CoercionLevel -> Int
CoercionLevel -> [CoercionLevel]
CoercionLevel -> CoercionLevel
CoercionLevel -> CoercionLevel -> [CoercionLevel]
CoercionLevel -> CoercionLevel -> CoercionLevel -> [CoercionLevel]
(CoercionLevel -> CoercionLevel)
-> (CoercionLevel -> CoercionLevel)
-> (Int -> CoercionLevel)
-> (CoercionLevel -> Int)
-> (CoercionLevel -> [CoercionLevel])
-> (CoercionLevel -> CoercionLevel -> [CoercionLevel])
-> (CoercionLevel -> CoercionLevel -> [CoercionLevel])
-> (CoercionLevel
-> CoercionLevel -> CoercionLevel -> [CoercionLevel])
-> Enum CoercionLevel
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: CoercionLevel -> CoercionLevel -> CoercionLevel -> [CoercionLevel]
$cenumFromThenTo :: CoercionLevel -> CoercionLevel -> CoercionLevel -> [CoercionLevel]
enumFromTo :: CoercionLevel -> CoercionLevel -> [CoercionLevel]
$cenumFromTo :: CoercionLevel -> CoercionLevel -> [CoercionLevel]
enumFromThen :: CoercionLevel -> CoercionLevel -> [CoercionLevel]
$cenumFromThen :: CoercionLevel -> CoercionLevel -> [CoercionLevel]
enumFrom :: CoercionLevel -> [CoercionLevel]
$cenumFrom :: CoercionLevel -> [CoercionLevel]
fromEnum :: CoercionLevel -> Int
$cfromEnum :: CoercionLevel -> Int
toEnum :: Int -> CoercionLevel
$ctoEnum :: Int -> CoercionLevel
pred :: CoercionLevel -> CoercionLevel
$cpred :: CoercionLevel -> CoercionLevel
succ :: CoercionLevel -> CoercionLevel
$csucc :: CoercionLevel -> CoercionLevel
Enum,CoercionLevel
CoercionLevel -> CoercionLevel -> Bounded CoercionLevel
forall a. a -> a -> Bounded a
maxBound :: CoercionLevel
$cmaxBound :: CoercionLevel
minBound :: CoercionLevel
$cminBound :: CoercionLevel
Bounded)
data CopyToStoreMode
= CopyToStore
| DontCopyToStore
deriving (CopyToStoreMode -> CopyToStoreMode -> Bool
(CopyToStoreMode -> CopyToStoreMode -> Bool)
-> (CopyToStoreMode -> CopyToStoreMode -> Bool)
-> Eq CopyToStoreMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CopyToStoreMode -> CopyToStoreMode -> Bool
$c/= :: CopyToStoreMode -> CopyToStoreMode -> Bool
== :: CopyToStoreMode -> CopyToStoreMode -> Bool
$c== :: CopyToStoreMode -> CopyToStoreMode -> Bool
Eq,Eq CopyToStoreMode
Eq CopyToStoreMode
-> (CopyToStoreMode -> CopyToStoreMode -> Ordering)
-> (CopyToStoreMode -> CopyToStoreMode -> Bool)
-> (CopyToStoreMode -> CopyToStoreMode -> Bool)
-> (CopyToStoreMode -> CopyToStoreMode -> Bool)
-> (CopyToStoreMode -> CopyToStoreMode -> Bool)
-> (CopyToStoreMode -> CopyToStoreMode -> CopyToStoreMode)
-> (CopyToStoreMode -> CopyToStoreMode -> CopyToStoreMode)
-> Ord CopyToStoreMode
CopyToStoreMode -> CopyToStoreMode -> Bool
CopyToStoreMode -> CopyToStoreMode -> Ordering
CopyToStoreMode -> CopyToStoreMode -> CopyToStoreMode
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 :: CopyToStoreMode -> CopyToStoreMode -> CopyToStoreMode
$cmin :: CopyToStoreMode -> CopyToStoreMode -> CopyToStoreMode
max :: CopyToStoreMode -> CopyToStoreMode -> CopyToStoreMode
$cmax :: CopyToStoreMode -> CopyToStoreMode -> CopyToStoreMode
>= :: CopyToStoreMode -> CopyToStoreMode -> Bool
$c>= :: CopyToStoreMode -> CopyToStoreMode -> Bool
> :: CopyToStoreMode -> CopyToStoreMode -> Bool
$c> :: CopyToStoreMode -> CopyToStoreMode -> Bool
<= :: CopyToStoreMode -> CopyToStoreMode -> Bool
$c<= :: CopyToStoreMode -> CopyToStoreMode -> Bool
< :: CopyToStoreMode -> CopyToStoreMode -> Bool
$c< :: CopyToStoreMode -> CopyToStoreMode -> Bool
compare :: CopyToStoreMode -> CopyToStoreMode -> Ordering
$ccompare :: CopyToStoreMode -> CopyToStoreMode -> Ordering
$cp1Ord :: Eq CopyToStoreMode
Ord,Int -> CopyToStoreMode
CopyToStoreMode -> Int
CopyToStoreMode -> [CopyToStoreMode]
CopyToStoreMode -> CopyToStoreMode
CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode]
CopyToStoreMode
-> CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode]
(CopyToStoreMode -> CopyToStoreMode)
-> (CopyToStoreMode -> CopyToStoreMode)
-> (Int -> CopyToStoreMode)
-> (CopyToStoreMode -> Int)
-> (CopyToStoreMode -> [CopyToStoreMode])
-> (CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode])
-> (CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode])
-> (CopyToStoreMode
-> CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode])
-> Enum CopyToStoreMode
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: CopyToStoreMode
-> CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode]
$cenumFromThenTo :: CopyToStoreMode
-> CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode]
enumFromTo :: CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode]
$cenumFromTo :: CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode]
enumFromThen :: CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode]
$cenumFromThen :: CopyToStoreMode -> CopyToStoreMode -> [CopyToStoreMode]
enumFrom :: CopyToStoreMode -> [CopyToStoreMode]
$cenumFrom :: CopyToStoreMode -> [CopyToStoreMode]
fromEnum :: CopyToStoreMode -> Int
$cfromEnum :: CopyToStoreMode -> Int
toEnum :: Int -> CopyToStoreMode
$ctoEnum :: Int -> CopyToStoreMode
pred :: CopyToStoreMode -> CopyToStoreMode
$cpred :: CopyToStoreMode -> CopyToStoreMode
succ :: CopyToStoreMode -> CopyToStoreMode
$csucc :: CopyToStoreMode -> CopyToStoreMode
Enum,CopyToStoreMode
CopyToStoreMode -> CopyToStoreMode -> Bounded CopyToStoreMode
forall a. a -> a -> Bounded a
maxBound :: CopyToStoreMode
$cmaxBound :: CopyToStoreMode
minBound :: CopyToStoreMode
$cminBound :: CopyToStoreMode
Bounded)
coerceToString
:: ( Framed e m
, MonadStore m
, MonadThrow m
, MonadDataErrorContext t f m
, MonadValue (NValue t f m) m
)
=> (NValue t f m -> NValue t f m -> m (NValue t f m))
-> CopyToStoreMode
-> CoercionLevel
-> NValue t f m
-> m NixString
coerceToString :: (NValue t f m -> NValue t f m -> m (NValue t f m))
-> CopyToStoreMode -> CoercionLevel -> NValue t f m -> m NixString
coerceToString NValue t f m -> NValue t f m -> m (NValue t f m)
call CopyToStoreMode
ctsm CoercionLevel
clevel = NValue t f m -> m NixString
forall e.
(Has e Frames, MonadReader e m) =>
NValue t f m -> m NixString
go
where
go :: NValue t f m -> m NixString
go NValue t f m
x =
do
NValue t f m
x' <- NValue t f m -> m (NValue t f m)
forall v (m :: * -> *). MonadValue v m => v -> m v
demand NValue t f m
x
m NixString -> m NixString -> Bool -> m NixString
forall a. a -> a -> Bool -> a
bool
(NValue t f m -> m NixString
forall e.
(Has e Frames, MonadReader e m, MonadReader e m) =>
NValue t f m -> m NixString
coerceStringy NValue t f m
x')
(NValue t f m -> m NixString
forall e.
(Has e Frames, MonadReader e m, MonadReader e m) =>
NValue t f m -> m NixString
coerceAny NValue t f m
x')
(CoercionLevel
clevel CoercionLevel -> CoercionLevel -> Bool
forall a. Eq a => a -> a -> Bool
== CoercionLevel
CoerceAny)
where
coerceAny :: NValue t f m -> m NixString
coerceAny NValue t f m
x' =
case NValue t f m
x' of
NVConstant (NBool Bool
b) ->
Text -> m NixString
castToNixString (Text -> m NixString) -> Text -> m NixString
forall a b. (a -> b) -> a -> b
$
Text -> Text -> Bool -> Text
forall a. a -> a -> Bool -> a
bool
Text
""
Text
"1"
Bool
b
NVConstant (NInt Integer
n) ->
Text -> m NixString
castToNixString (Text -> m NixString) -> Text -> m NixString
forall a b. (a -> b) -> a -> b
$
Integer -> Text
forall b a. (Show a, IsString b) => a -> b
show Integer
n
NVConstant (NFloat Float
n) ->
Text -> m NixString
castToNixString (Text -> m NixString) -> Text -> m NixString
forall a b. (a -> b) -> a -> b
$
Float -> Text
forall b a. (Show a, IsString b) => a -> b
show Float
n
NVConstant NAtom
NNull ->
Text -> m NixString
castToNixString Text
""
NVList [NValue t f m]
l ->
[NixString] -> NixString
nixStringUnwords ([NixString] -> NixString) -> m [NixString] -> m NixString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (NValue t f m -> m NixString) -> [NValue t f m] -> m [NixString]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (NValue t f m -> m NixString
go (NValue t f m -> m NixString)
-> (NValue t f m -> m (NValue t f m))
-> NValue t f m
-> m NixString
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< NValue t f m -> m (NValue t f m)
forall v (m :: * -> *). MonadValue v m => v -> m v
demand) [NValue t f m]
l
NValue t f m
v -> NValue t f m -> m NixString
forall e.
(Has e Frames, MonadReader e m, MonadReader e m) =>
NValue t f m -> m NixString
coerceStringy NValue t f m
v
coerceStringy :: NValue t f m -> m NixString
coerceStringy NValue t f m
x' =
case NValue t f m
x' of
NVStr NixString
ns -> NixString -> m NixString
forall (f :: * -> *) a. Applicative f => a -> f a
pure NixString
ns
NVPath FilePath
p ->
(FilePath -> m NixString)
-> (FilePath -> m NixString) -> Bool -> FilePath -> m NixString
forall a. a -> a -> Bool -> a
bool
(Text -> m NixString
castToNixString (Text -> m NixString)
-> (FilePath -> Text) -> FilePath -> m NixString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> Text
forall a. ToText a => a -> Text
toText)
((StorePath -> NixString) -> m StorePath -> m NixString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap StorePath -> NixString
storePathToNixString (m StorePath -> m NixString)
-> (FilePath -> m StorePath) -> FilePath -> m NixString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> m StorePath
forall e (m :: * -> *).
(Framed e m, MonadStore m) =>
FilePath -> m StorePath
addPath)
(CopyToStoreMode
ctsm CopyToStoreMode -> CopyToStoreMode -> Bool
forall a. Eq a => a -> a -> Bool
== CopyToStoreMode
CopyToStore)
FilePath
p
v :: NValue t f m
v@(NVSet AttrSet (NValue t f m)
s AttrSet SourcePos
_) ->
m NixString
-> (NValue t f m -> m NixString)
-> Maybe (NValue t f m)
-> m NixString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(m NixString
-> (NValue t f m -> m NixString)
-> Maybe (NValue t f m)
-> m NixString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(NValue t f m -> m NixString
forall e (m :: * -> *) a a.
(MonadReader e m, Has e Frames, MonadThrow m, Show a) =>
a -> m a
err NValue t f m
v)
(Bool -> NValue t f m -> m NixString
gosw Bool
False)
(Text -> AttrSet (NValue t f m) -> Maybe (NValue t f m)
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Text
"outPath" AttrSet (NValue t f m)
s)
)
(Bool -> NValue t f m -> m NixString
gosw Bool
True)
(Text -> AttrSet (NValue t f m) -> Maybe (NValue t f m)
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
M.lookup Text
"__toString" AttrSet (NValue t f m)
s)
where
gosw :: Bool -> NValue t f m -> m NixString
gosw Bool
b NValue t f m
p =
do
NValue t f m
p' <- NValue t f m -> m (NValue t f m)
forall v (m :: * -> *). MonadValue v m => v -> m v
demand NValue t f m
p
(NValue t f m -> m NixString)
-> (NValue t f m -> m NixString)
-> Bool
-> NValue t f m
-> m NixString
forall a. a -> a -> Bool -> a
bool
NValue t f m -> m NixString
go
(NValue t f m -> m NixString
go (NValue t f m -> m NixString)
-> (NValue t f m -> m (NValue t f m))
-> NValue t f m
-> m NixString
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< (NValue t f m -> NValue t f m -> m (NValue t f m)
`call` NValue t f m
v))
Bool
b
NValue t f m
p'
NValue t f m
v -> NValue t f m -> m NixString
forall e (m :: * -> *) a a.
(MonadReader e m, Has e Frames, MonadThrow m, Show a) =>
a -> m a
err NValue t f m
v
err :: a -> m a
err a
v = ErrorCall -> m a
forall s e (m :: * -> *) a.
(Framed e m, Exception s, MonadThrow m) =>
s -> m a
throwError (ErrorCall -> m a) -> ErrorCall -> m a
forall a b. (a -> b) -> a -> b
$ FilePath -> ErrorCall
ErrorCall (FilePath -> ErrorCall) -> FilePath -> ErrorCall
forall a b. (a -> b) -> a -> b
$ FilePath
"Expected a string, but saw: " FilePath -> FilePath -> FilePath
forall a. Semigroup a => a -> a -> a
<> a -> FilePath
forall b a. (Show a, IsString b) => a -> b
show a
v
castToNixString :: Text -> m NixString
castToNixString = NixString -> m NixString
forall (f :: * -> *) a. Applicative f => a -> f a
pure (NixString -> m NixString)
-> (Text -> NixString) -> Text -> m NixString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> NixString
makeNixStringWithoutContext
nixStringUnwords :: [NixString] -> NixString
nixStringUnwords = NixString -> [NixString] -> NixString
intercalateNixString (NixString -> [NixString] -> NixString)
-> NixString -> [NixString] -> NixString
forall a b. (a -> b) -> a -> b
$ Text -> NixString
makeNixStringWithoutContext Text
" "
storePathToNixString :: StorePath -> NixString
storePathToNixString :: StorePath -> NixString
storePathToNixString StorePath
sp =
Text -> StringContext -> NixString
makeNixStringWithSingletonContext
Text
t
(Text -> ContextFlavor -> StringContext
StringContext Text
t ContextFlavor
DirectPath)
where
t :: Text
t = FilePath -> Text
forall a. ToText a => a -> Text
toText (FilePath -> Text) -> FilePath -> Text
forall a b. (a -> b) -> a -> b
$ StorePath -> FilePath
unStorePath StorePath
sp