diff --git a/snack-lib/files.nix b/snack-lib/files.nix index 4e4f377..b6ff048 100644 --- a/snack-lib/files.nix +++ b/snack-lib/files.nix @@ -50,6 +50,12 @@ rec { doesFileExist = base: filename: lib.lists.elem filename (listFilesInDir base); + fileExtension = fp: + let + exts = lib.splitString "." (builtins.baseNameOf fp); + in if lib.length exts == 0 then null else lib.last exts; + + listFilesInDir = dir: let go = dir: dirName: diff --git a/snack-lib/hpack.nix b/snack-lib/hpack.nix index fa62816..e9e9ba9 100644 --- a/snack-lib/hpack.nix +++ b/snack-lib/hpack.nix @@ -1,6 +1,7 @@ -{ lib, glibcLocales, callPackage, writeText, runCommand, haskellPackages }: +{ lib, dhall-json, glibcLocales, callPackage, writeText, runCommand, haskellPackages }: with (callPackage ./lib.nix {}); +with (callPackage ./files.nix {}); with (callPackage ./modules.nix {}); let @@ -19,6 +20,16 @@ let "${y2j} ${writeText "y2j" text} > $out" ); in builtins.fromJSON json; + + fromDhall = text: + let json = + + builtins.readFile (runCommand "d2j" + { buildInputs = [ dhall-json ]; } + # hack: dhall-to-json gets a path and then imports the contents + "dhall-to-json <<< ${writeText "d2j" text} > $out" + ); + in builtins.fromJSON json; in { # Returns an attribute set with two fields: @@ -26,7 +37,21 @@ in # - executable: an attr set of executable name to package spec pkgDescrsFromHPack = packageYaml: let - package = fromYAML (builtins.readFile packageYaml); + package = + let + ext = fileExtension packageYaml; + fromFile = + if ext == null + then abort "File ${packageYaml} has no extension!" + else if ext == "yaml" + then fromYAML + else if ext == "yml" + then fromYAML + else if ext == "dhall" + then fromDhall + else + abort "File ${packageYaml} has an unknown extension (${ext})!"; + in fromFile (builtins.readFile packageYaml); # Snack drops the version bounds because here it has no meaning dropVersionBounds = diff --git a/tests/readme/package.dhall b/tests/readme/package.dhall new file mode 100644 index 0000000..ab0811d --- /dev/null +++ b/tests/readme/package.dhall @@ -0,0 +1,16 @@ +{ name = "snack-readme" + +, dependencies = + [ "lens", "wreq" ] + +, library = + { source-dirs = "./src" } + +, executable = + { main = "Main.hs" + , source-dirs = "./app" + , dependencies = [ "snack-readme" ] + } + +, default-extensions = [ "OverloadedStrings" ] +} diff --git a/tests/readme/test b/tests/readme/test index 95a88a5..3269970 100755 --- a/tests/readme/test +++ b/tests/readme/test @@ -11,3 +11,4 @@ test() { SNACK="snack" test SNACK="snack -s ./snack.nix" test SNACK="snack --package-yaml ./package.yaml" test +SNACK="snack --package-yaml ./package.dhall" test