packages feed

libnix-0.2.0.1: README.md

# libnix

Haskell bindings to the [nix package manager][nix]

This project aims to provide an interface to call [nix][nix] functionality from
the safe haven that is Haskell. As much type safety as possible should be
guaranteed to the user.

The project consists of two broad steps:

1. bindings to the command line tools
2. bindings to the nix libraries themselves

At the moment, an beta version of 1. is implemented, together with a small
number of tests to check for possible changes in the interface,
which consists mainly of three functions:

```haskell
parseNixExpr :: Text                 -> NixAction ParseError NixExpr
instantiate  :: NixExpr              -> NixAction InstantiateError (StorePath Derivation)
realize      :: StorePath Derivation -> NixAction RealizeError (StorePath Realized)
```

which do what you’d expect; and two helper functions

```haskell
eval             :: NixExpr -> NixAction InstantiateError ()
parseInstRealize :: Text    -> NixAction NixError (StorePath Realized)
```

where `parseInstRealize` performs all three steps at once.

[nix]: https://github.com/NixOS/nix


## Nix Prefetch Wrappers

We implement an additional module that creates nicely typed wrappers
for `nix-prefetch-X` tools, please see the module documentation what
is supported exactly.

```haskell
url :: UrlOptions -> NixAction PrefetchError (Sha256, StorePath Realized)
git :: GitOptions -> NixAction PrefetchError GitOutput
```


## C++ bindings

The second steps would be to directly bind into the C++ library. That could
either mean writing a C wrapper and using Haskell’s native FFI, or generating
bindings with [Hoppy][hoppy], which we’d prefer. Hoppy would need to be able to
[handle C++ exceptions][exc] first, though.

[hoppy]: http://khumba.net/projects/hoppy/
[exc]: https://gitlab.com/khumba/hoppy/issues/10

## Other nix libraries on hackage

- [cabal2nix](https://hackage.haskell.org/package/cabal2nix): the executable at the base of nix haskell support
- [language-nix](https://hackage.haskell.org/package/language-nix): library cabal2nix uses to generate its nix files
- [hnix](https://hackage.haskell.org/package/hnix): a project to implement the nix expression language in haskell
- [nix-eval](https://hackage.haskell.org/package/nix-eval): runtime eval of Haskell code using nix
- [simple-nix](https://hackage.haskell.org/package/simple-nix): looks like a nix parser, but not entirely sure

It doesn’t look like the scope of libnix collides with any of these packages.