dhall-to-cabal 1.2.0.0 → 1.3.0.0
raw patch · 26 files changed
+906/−597 lines, 26 filesdep +directorydep +microlensdep ~dhallnew-component:exe:dhall-to-cabal-metaPVP ok
version bump matches the API change (PVP)
Dependencies added: directory, microlens
Dependency ranges changed: dhall
API changes (from Hackage documentation)
+ CabalToDhall: Benchmark :: KnownDefault
+ CabalToDhall: BuildInfo :: KnownDefault
+ CabalToDhall: CompilerOptions :: KnownDefault
+ CabalToDhall: Executable :: KnownDefault
+ CabalToDhall: Library :: KnownDefault
+ CabalToDhall: Package :: KnownDefault
+ CabalToDhall: PreludeConstructorsLicense :: PreludeReference
+ CabalToDhall: PreludeConstructorsRepoKind :: PreludeReference
+ CabalToDhall: PreludeConstructorsScope :: PreludeReference
+ CabalToDhall: PreludeDefault :: KnownDefault -> PreludeReference
+ CabalToDhall: PreludeV :: PreludeReference
+ CabalToDhall: SourceRepo :: KnownDefault
+ CabalToDhall: TestSuite :: KnownDefault
+ CabalToDhall: data KnownDefault
+ CabalToDhall: data PreludeReference
+ CabalToDhall: getDefault :: (Eq s) => Import -> (PreludeReference -> Expr s Import) -> KnownDefault -> Expr s Import
+ CabalToDhall: instance GHC.Classes.Eq CabalToDhall.KnownDefault
+ CabalToDhall: instance GHC.Classes.Ord CabalToDhall.KnownDefault
+ CabalToDhall: instance GHC.Enum.Bounded CabalToDhall.KnownDefault
+ CabalToDhall: instance GHC.Enum.Enum CabalToDhall.KnownDefault
+ CabalToDhall: instance GHC.Read.Read CabalToDhall.KnownDefault
+ CabalToDhall: instance GHC.Show.Show CabalToDhall.KnownDefault
+ CabalToDhall: resolvePreludeVar :: PreludeReference -> Expr s a
- DhallToCabal: dhallToCabal :: FilePath -> Text -> IO GenericPackageDescription
+ DhallToCabal: dhallToCabal :: InputSettings -> Text -> IO GenericPackageDescription
Files
- Changelog.md +14/−1
- README.md +2/−2
- dhall-to-cabal.cabal +28/−5
- dhall/defaults/Benchmark.dhall +2/−1
- dhall/defaults/BuildInfo.dhall +83/−86
- dhall/defaults/CompilerOptions.dhall +24/−21
- dhall/defaults/Executable.dhall +4/−2
- dhall/defaults/Library.dhall +16/−9
- dhall/defaults/Package.dhall +86/−91
- dhall/defaults/SourceRepo.dhall +18/−15
- dhall/defaults/TestSuite.dhall +2/−1
- exe/Main.hs +53/−3
- golden-tests/GoldenTests.hs +7/−2
- golden-tests/dhall-to-cabal/SPDX.dhall +2/−2
- golden-tests/dhall-to-cabal/compiler-options-order.dhall +4/−4
- golden-tests/dhall-to-cabal/conditional-dependencies.dhall +4/−4
- golden-tests/dhall-to-cabal/dhall-to-cabal.dhall +2/−2
- golden-tests/dhall-to-cabal/empty-package.dhall +4/−4
- golden-tests/dhall-to-cabal/gh-53.dhall +2/−2
- golden-tests/dhall-to-cabal/gh-55.dhall +5/−5
- golden-tests/dhall-to-cabal/map-source-repo.dhall +4/−4
- golden-tests/dhall-to-cabal/nested-conditions.dhall +2/−2
- lib/CabalToDhall.hs +207/−105
- lib/Dhall/Extra.hs +1/−63
- lib/DhallToCabal.hs +165/−161
- meta/Main.hs +165/−0
Changelog.md view
@@ -1,6 +1,19 @@ # dhall-to-cabal change log -## NEXT+## 1.3.0.0 -- 2018-07-28++### Breaking API Changes++* `DhallToCabal.dhallToCabal` now takes an `InputSettings` from+ `dhall` as its first argument.++### Functional Changes++* `dhall-to-cabal` has a new `--print-default TYPE` flag.++* When reading from a file, `dhall-to-cabal` now interprets imports as+ being relative to that file, rather than the current working+ directory. (#114) ## 1.2.0.0 -- 2018-07-05
README.md view
@@ -46,7 +46,7 @@ Good news! `dhall-to-cabal` is currently running a two-for-one deal! By installing `dhall-to-cabal` we'll throw in the `cabal-to-dhall` executable *absolutely free*! `cabal-to-dhall` does the reverse of `dhall-to-cabal` --taking `.cabal` files and trasforming them into appropriate Dhall expressions.+taking `.cabal` files and transforming them into appropriate Dhall expressions. This can be a great way to get started with `dhall-to-cabal`. ## The Details@@ -116,7 +116,7 @@ `library` field. It's OK if you don't follow all of the above - my goal is to simply get you-familiar with what a Dhall expression would look like. The Dhall lanugage itself+familiar with what a Dhall expression would look like. The Dhall language itself has a [much more detailed tutorial](https://hackage.haskell.org/package/dhall-1.9.1/docs/Dhall-Tutorial.html) and [other documentation](https://github.com/dhall-lang/dhall-lang/wiki).
dhall-to-cabal.cabal view
@@ -9,7 +9,7 @@ -- 'dhall-to-cabal -- dhall-to-cabal.dhall > dhall-to-cabal.cabal'. -- * * * * * * * * * * * * WARNING * * * * * * * * * * * * name: dhall-to-cabal-version: 1.2.0.0+version: 1.3.0.0 license: MIT license-file: LICENSE maintainer: ollie@ocharles.org.uk@@ -24,6 +24,7 @@ (including conditional stanzas). . category: Distribution+build-type: Simple extra-source-files: Changelog.md README.md@@ -132,7 +133,7 @@ bytestring ^>=0.10, containers ^>=0.5 || ^>=0.6, contravariant ^>=1.4 || ^>=1.5,- dhall ^>=1.15.0,+ dhall ^>=1.16.0, hashable ^>=1.2.6.1, insert-ordered-containers ^>=0.2.1.0, text ^>=1.2,@@ -156,9 +157,11 @@ build-depends: Cabal ^>=2.2, base ^>=4.10 || ^>=4.11 || ^>=4.12,- dhall ^>=1.15.0,+ dhall ^>=1.16.0, dhall-to-cabal -any,+ filepath ^>=1.4, insert-ordered-containers ^>=0.2.1.0,+ microlens ^>=0.1.0.0 || ^>=0.2.0.0 || ^>=0.3.0.0 || ^>=0.4.0.0, optparse-applicative ^>=0.13.2 || ^>=0.14, prettyprinter ^>=1.2.0.1, text ^>=1.2,@@ -180,13 +183,32 @@ -fno-warn-name-shadowing build-depends: base ^>=4.10 || ^>=4.11 || ^>=4.12,- dhall ^>=1.15.0,+ dhall ^>=1.16.0, bytestring ^>=0.10, dhall-to-cabal -any, optparse-applicative ^>=0.13.2 || ^>=0.14, prettyprinter ^>=1.2.0.1, text ^>=1.2 +executable dhall-to-cabal-meta+ main-is: Main.hs+ scope: private+ hs-source-dirs: meta+ default-language: Haskell2010+ ghc-options: -Weverything -Wno-safe -Wno-unsafe+ -Wno-implicit-prelude -Wno-missed-specialisations+ -Wno-all-missed-specialisations -Wno-missing-import-lists+ -Wno-missing-local-signatures -Wno-monomorphism-restriction+ -fno-warn-name-shadowing+ build-depends:+ base ^>=4.10 || ^>=4.11 || ^>=4.12,+ directory ^>=1.3.0.2,+ dhall ^>=1.16.0,+ dhall-to-cabal -any,+ filepath ^>=1.4,+ optparse-applicative ^>=0.13.2 || ^>=0.14,+ prettyprinter ^>=1.2.0.1+ test-suite golden-tests type: exitcode-stdio-1.0 main-is: GoldenTests.hs@@ -202,9 +224,10 @@ Cabal ^>=2.2, Diff ^>=0.3.4, bytestring ^>=0.10,- dhall ^>=1.15.0,+ dhall ^>=1.16.0, dhall-to-cabal -any, filepath ^>=1.4,+ microlens ^>=0.1.0.0 || ^>=0.2.0.0 || ^>=0.3.0.0 || ^>=0.4.0.0, prettyprinter ^>=1.2.0.1, tasty ^>=0.11 || ^>=0.12 || ^>=1.0 || ^>=1.1, tasty-golden ^>=2.3,
dhall/defaults/Benchmark.dhall view
@@ -1,1 +1,2 @@-./BuildInfo.dhall +-- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).+let types = ./../types.dhall in ././BuildInfo.dhall
dhall/defaults/BuildInfo.dhall view
@@ -1,86 +1,83 @@-{ autogen-modules =- [] : List Text-, build-depends =- [] : List ../types/Dependency.dhall -, build-tool-depends =- [] : List- { component :- Text- , package :- Text- , version :- ../types/VersionRange.dhall - }-, build-tools =- [] : List { exe : Text, version : ../types/VersionRange.dhall }-, buildable =- True-, c-sources =- [] : List Text-, cc-options =- [] : List Text-, compiler-options =- ./CompilerOptions.dhall -, cpp-options =- [] : List Text-, default-extensions =- [] : List ../types/Extension.dhall -, default-language =- [] : Optional ../types/Language.dhall -, extra-framework-dirs =- [] : List Text-, extra-ghci-libraries =- [] : List Text-, extra-lib-dirs =- [] : List Text-, extra-libraries =- [] : List Text-, frameworks =- [] : List Text-, hs-source-dirs =- [] : List Text-, includes =- [] : List Text-, include-dirs =- [] : List Text-, install-includes =- [] : List Text-, js-sources =- [] : List Text-, ld-options =- [] : List Text-, other-extensions =- [] : List ../types/Extension.dhall -, other-languages =- [] : List ../types/Language.dhall -, other-modules =- [] : List Text-, pkgconfig-depends =- [] : List { name : Text, version : ../types/VersionRange.dhall }-, profiling-options =- ./CompilerOptions.dhall -, shared-options =- ./CompilerOptions.dhall-, static-options =- ./CompilerOptions.dhall-, mixins =- [] : List ../types/Mixin.dhall-, asm-options =- [] : List Text-, asm-sources =- [] : List Text-, cmm-options =- [] : List Text-, cmm-sources =- [] : List Text-, cxx-options =- [] : List Text-, cxx-sources =- [] : List Text-, virtual-modules =- [] : List Text-, extra-lib-flavours =- [] : List Text-, extra-bundled-libs =- [] : List Text-}+-- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).+ let types = ./../types.dhall++in { autogen-modules =+ [] : List Text+ , build-depends =+ [] : List { bounds : types.VersionRange, package : Text }+ , build-tool-depends =+ [] : List+ { component : Text, package : Text, version : types.VersionRange }+ , build-tools =+ [] : List { exe : Text, version : types.VersionRange }+ , buildable =+ True+ , c-sources =+ [] : List Text+ , cc-options =+ [] : List Text+ , compiler-options =+ ././CompilerOptions.dhall+ , cpp-options =+ [] : List Text+ , default-extensions =+ [] : List types.Extension+ , default-language =+ [] : Optional types.Language+ , extra-framework-dirs =+ [] : List Text+ , extra-ghci-libraries =+ [] : List Text+ , extra-lib-dirs =+ [] : List Text+ , extra-libraries =+ [] : List Text+ , frameworks =+ [] : List Text+ , hs-source-dirs =+ [] : List Text+ , includes =+ [] : List Text+ , include-dirs =+ [] : List Text+ , install-includes =+ [] : List Text+ , js-sources =+ [] : List Text+ , ld-options =+ [] : List Text+ , other-extensions =+ [] : List types.Extension+ , other-languages =+ [] : List types.Language+ , other-modules =+ [] : List Text+ , pkgconfig-depends =+ [] : List { name : Text, version : types.VersionRange }+ , profiling-options =+ ././CompilerOptions.dhall+ , shared-options =+ ././CompilerOptions.dhall+ , static-options =+ ././CompilerOptions.dhall+ , mixins =+ [] : List types.Mixin+ , asm-options =+ [] : List Text+ , asm-sources =+ [] : List Text+ , cmm-options =+ [] : List Text+ , cmm-sources =+ [] : List Text+ , cxx-options =+ [] : List Text+ , cxx-sources =+ [] : List Text+ , virtual-modules =+ [] : List Text+ , extra-lib-flavours =+ [] : List Text+ , extra-bundled-libs =+ [] : List Text+ }
dhall/defaults/CompilerOptions.dhall view
@@ -1,21 +1,24 @@-{ GHC =- [] : List Text-, GHCJS =- [] : List Text-, HBC =- [] : List Text-, Helium =- [] : List Text-, Hugs =- [] : List Text-, JHC =- [] : List Text-, LHC =- [] : List Text-, NHC =- [] : List Text-, UHC =- [] : List Text-, YHC =- [] : List Text-}+-- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).+ let types = ./../types.dhall++in { GHC =+ [] : List Text+ , GHCJS =+ [] : List Text+ , HBC =+ [] : List Text+ , Helium =+ [] : List Text+ , Hugs =+ [] : List Text+ , JHC =+ [] : List Text+ , LHC =+ [] : List Text+ , NHC =+ [] : List Text+ , UHC =+ [] : List Text+ , YHC =+ [] : List Text+ }
dhall/defaults/Executable.dhall view
@@ -1,2 +1,4 @@- ./BuildInfo.dhall -⫽ { scope = (constructors ../types/Scope.dhall ).Public {=} }+-- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).+ let types = ./../types.dhall++in ././BuildInfo.dhall ⫽ { scope = (constructors types.Scope).Public {=} }
dhall/defaults/Library.dhall view
@@ -1,9 +1,16 @@- ./BuildInfo.dhall -⫽ { exposed-modules =- [] : List Text- , reexported-modules =- [] : List- { name : Text, original : { name : Text, package : Optional Text } }- , signatures =- [] : List Text- }+-- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).+ let types = ./../types.dhall++in ././BuildInfo.dhall+ ⫽ { exposed-modules =+ [] : List Text+ , reexported-modules =+ [] : List+ { name :+ Text+ , original :+ { name : Text, package : Optional Text }+ }+ , signatures =+ [] : List Text+ }
dhall/defaults/Package.dhall view
@@ -1,91 +1,86 @@-{ author =- ""-, flags =- [] : List ../types/Flag.dhall -, benchmarks =- [] : List- { benchmark :- ../types/Guarded.dhall ../types/Benchmark.dhall - , name :- Text- }-, bug-reports =- ""-, build-type =- [] : Optional ../types/BuildType.dhall-, cabal-version =- ../Version/v.dhall "2.2"-, category =- ""-, copyright =- ""-, data-dir =- ""-, data-files =- [] : List Text-, description =- ""-, executables =- [] : List- { executable :- ../types/Guarded.dhall ../types/Executable.dhall - , name :- Text- }-, extra-doc-files =- [] : List Text-, extra-source-files =- [] : List Text-, extra-tmp-files =- [] : List Text-, foreign-libraries =- [] : List- { foreign-lib :- ../types/Guarded.dhall ../types/ForeignLibrary.dhall - , name :- Text- }-, homepage =- ""-, library =- [] : Optional (../types/Guarded.dhall ../types/Library.dhall )-, license =- (constructors ../types/License.dhall ).AllRightsReserved {=}-, license-files =- [] : List Text-, maintainer =- ""-, package-url =- ""-, source-repos =- [] : List ../types/SourceRepo.dhall -, stability =- ""-, sub-libraries =- [] : List- { library :- ../types/Guarded.dhall ../types/Library.dhall - , name :- Text- }-, synopsis =- ""-, test-suites =- [] : List- { name :- Text- , test-suite :- ../types/Guarded.dhall ../types/TestSuite.dhall - }-, tested-with =- [] : List- { compiler :- ../types/Compiler.dhall - , version :- ../types/VersionRange.dhall - }-, x-fields =- [] : List { _1 : Text, _2 : Text }-, custom-setup =- [] : Optional ../types/SetupBuildInfo.dhall -}+-- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).+ let types = ./../types.dhall++in { author =+ ""+ , flags =+ [] : List+ { default : Bool, description : Text, manual : Bool, name : Text }+ , benchmarks =+ [] : List+ { name :+ Text+ , benchmark :+ ∀(config : types.Config) → types.Benchmark+ }+ , bug-reports =+ ""+ , build-type =+ [] : Optional types.BuildType+ , cabal-version =+ ./../Version/v.dhall "2.2"+ , category =+ ""+ , copyright =+ ""+ , data-dir =+ ""+ , data-files =+ [] : List Text+ , description =+ ""+ , executables =+ [] : List+ { name :+ Text+ , executable :+ ∀(config : types.Config) → types.Executable+ }+ , extra-doc-files =+ [] : List Text+ , extra-source-files =+ [] : List Text+ , extra-tmp-files =+ [] : List Text+ , foreign-libraries =+ [] : List+ { name :+ Text+ , foreign-lib :+ ∀(config : types.Config) → types.ForeignLibrary+ }+ , homepage =+ ""+ , library =+ [] : Optional (∀(config : types.Config) → types.Library)+ , license =+ (constructors types.License).AllRightsReserved {=}+ , license-files =+ [] : List Text+ , maintainer =+ ""+ , package-url =+ ""+ , source-repos =+ [] : List types.SourceRepo+ , stability =+ ""+ , sub-libraries =+ [] : List+ { name : Text, library : ∀(config : types.Config) → types.Library }+ , synopsis =+ ""+ , test-suites =+ [] : List+ { name :+ Text+ , test-suite :+ ∀(config : types.Config) → types.TestSuite+ }+ , tested-with =+ [] : List { compiler : types.Compiler, version : types.VersionRange }+ , x-fields =+ [] : List { _1 : Text, _2 : Text }+ , custom-setup =+ [] : Optional types.CustomSetup+ }
dhall/defaults/SourceRepo.dhall view
@@ -1,15 +1,18 @@-{ type =- [] : Optional ../types/RepoType.dhall -, location =- [] : Optional Text-, module =- [] : Optional Text-, branch =- [] : Optional Text-, tag =- [] : Optional Text-, subdir =- [] : Optional Text-, kind =- (constructors ../types/RepoKind.dhall ).RepoHead {=}-}+-- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).+ let types = ./../types.dhall++in { type =+ [] : Optional types.RepoType+ , location =+ [] : Optional Text+ , module =+ [] : Optional Text+ , branch =+ [] : Optional Text+ , tag =+ [] : Optional Text+ , subdir =+ [] : Optional Text+ , kind =+ (constructors types.RepoKind).RepoHead {=}+ }
dhall/defaults/TestSuite.dhall view
@@ -1,1 +1,2 @@-./BuildInfo.dhall +-- This file is auto-generated by dhall-to-cabal-meta. Look but don't touch (unless you want your edits to be over-written).+let types = ./../types.dhall in ././BuildInfo.dhall
exe/Main.hs view
@@ -22,8 +22,11 @@ import Data.Text (Text) import Data.String ( fromString ) import Data.Version ( showVersion )+import Lens.Micro ( set )+import System.FilePath ( takeDirectory ) -import DhallLocation ( typesLocation, dhallFromGitHub )+import CabalToDhall ( KnownDefault, getDefault, resolvePreludeVar )+import DhallLocation ( preludeLocation, typesLocation, dhallFromGitHub ) import DhallToCabal import qualified Paths_dhall_to_cabal as Paths @@ -47,6 +50,7 @@ data Command = RunDhallToCabal DhallToCabalOptions | PrintType PrintTypeOptions+ | PrintDefault PrintDefaultOptions | PrintVersion @@ -170,6 +174,24 @@ ) +data PrintDefaultOptions =+ PrintDefaultOptions+ { defaultToPrint :: KnownDefault }+++printDefaultOptionsParser :: OptParse.Parser PrintDefaultOptions+printDefaultOptionsParser =+ PrintDefaultOptions+ <$>+ OptParse.option OptParse.auto+ ( mconcat+ [ OptParse.long "print-default"+ , OptParse.help "Print out the default values for a type, as found in prelude.defaults"+ , OptParse.metavar "TYPE"+ ]+ )++ runDhallToCabal :: DhallToCabalOptions -> IO () runDhallToCabal DhallToCabalOptions { dhallFilePath, explain } = do source <-@@ -181,10 +203,12 @@ StrictText.readFile filePath let- fileName = fromMaybe "(STDIN)" dhallFilePath+ settings = Dhall.defaultInputSettings+ & set Dhall.rootDirectory ( maybe "." takeDirectory dhallFilePath )+ & set Dhall.sourceName ( fromMaybe "(STDIN)" dhallFilePath ) explaining- ( dhallToCabal fileName source+ ( dhallToCabal settings source & fmap ( \ pkgDesc -> pkgDesc & Cabal.showGenericPackageDescription@@ -254,6 +278,9 @@ PrintType options -> printType options + PrintDefault options ->+ printDefault options+ PrintVersion -> printVersion @@ -263,6 +290,7 @@ asum [ RunDhallToCabal <$> dhallToCabalOptionsParser , PrintType <$> printTypeOptionsParser+ , PrintDefault <$> printDefaultOptionsParser , PrintVersion <$ printVersionParser ] @@ -679,3 +707,25 @@ printVersion :: IO () printVersion = do putStrLn ( "dhall-to-cabal version " ++ showVersion Paths.version )+++printDefault :: PrintDefaultOptions -> IO ()+printDefault PrintDefaultOptions {..} = do+ Pretty.renderIO+ System.IO.stdout+ ( Pretty.layoutSmart opts+ ( Pretty.pretty ( withPreludeImport expr ) )+ )++ putStrLn ""++ where+ withPreludeImport =+ Expr.Let "prelude" Nothing ( Expr.Embed ( preludeLocation dhallFromGitHub ) )++ expr :: Expr.Expr Dhall.Parser.Src Dhall.Import+ expr =+ getDefault+ ( typesLocation dhallFromGitHub )+ resolvePreludeVar+ defaultToPrint
golden-tests/GoldenTests.hs view
@@ -5,7 +5,8 @@ import Data.Algorithm.Diff import Data.Algorithm.DiffOutput import Data.Function ( (&) )-import System.FilePath ( takeBaseName, replaceExtension )+import Lens.Micro ( set )+import System.FilePath ( takeBaseName, takeDirectory, replaceExtension ) import Test.Tasty ( defaultMain, TestTree, testGroup ) import Test.Tasty.Golden ( findByExtension, goldenVsStringDiff ) import Test.Tasty.Golden.Advanced ( goldenTest )@@ -15,6 +16,7 @@ import qualified Data.Text.Lazy.Encoding as LazyText import qualified Data.Text.Prettyprint.Doc as Pretty import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty+import qualified Dhall import qualified Dhall.Core import qualified Distribution.PackageDescription.Parsec as Cabal import qualified Distribution.PackageDescription.PrettyPrint as Cabal@@ -91,7 +93,7 @@ [ goldenTest ( takeBaseName dhallFile ) ( Cabal.readGenericPackageDescription Cabal.normal cabalFile )- ( StrictText.readFile dhallFile >>= dhallToCabal dhallFile )+ ( StrictText.readFile dhallFile >>= dhallToCabal settings ) ( \ ( Cabal.showGenericPackageDescription -> exp ) ( Cabal.showGenericPackageDescription -> act ) -> do if exp == act then return Nothing@@ -105,6 +107,9 @@ ( Cabal.writeGenericPackageDescription cabalFile ) | dhallFile <- dhallFiles , let cabalFile = replaceExtension dhallFile ".cabal"+ settings = Dhall.defaultInputSettings+ & set Dhall.rootDirectory ( takeDirectory dhallFile )+ & set Dhall.sourceName dhallFile ] , testGroup "cabal-to-dhall" [ goldenVsStringDiff
golden-tests/dhall-to-cabal/SPDX.dhall view
@@ -1,5 +1,5 @@- let prelude = ./dhall/prelude.dhall-in let types = ./dhall/types.dhall+ let prelude = ../../dhall/prelude.dhall+in let types = ../../dhall/types.dhall in prelude.defaults.Package // { name = "foo" , version = prelude.v "0"
golden-tests/dhall-to-cabal/compiler-options-order.dhall view
@@ -1,6 +1,6 @@- let prelude = ./dhall/prelude.dhall+ let prelude = ../../dhall/prelude.dhall -in let types = ./dhall/types.dhall+in let types = ../../dhall/types.dhall in let v = prelude.v @@ -8,11 +8,11 @@ \ ( cfg : types.Config ) -> \ ( ver : types.VersionRange ) -> cfg.impl ( prelude.types.Compilers.GHC {=} ) ver -in ./dhall/defaults/Package.dhall +in ../../dhall/defaults/Package.dhall // { name = "Name" , version =- ./dhall/Version/v.dhall "1"+ ../../dhall/Version/v.dhall "1" , library = [ \ ( config : types.Config ) -> prelude.defaults.Library
golden-tests/dhall-to-cabal/conditional-dependencies.dhall view
@@ -1,6 +1,6 @@- let prelude = ./dhall/prelude.dhall+ let prelude = ../../dhall/prelude.dhall -in let types = ./dhall/types.dhall+in let types = ../../dhall/types.dhall in let v = prelude.v @@ -8,11 +8,11 @@ \ ( cfg : types.Config ) -> \ ( ver : types.VersionRange ) -> cfg.impl ( prelude.types.Compilers.GHC {=} ) ver -in ./dhall/defaults/Package.dhall+in ../../dhall/defaults/Package.dhall // { name = "Name" , version =- ./dhall/Version/v.dhall "1"+ ../../dhall/Version/v.dhall "1" , library = [ \ ( config : types.Config ) -> prelude.defaults.Library
golden-tests/dhall-to-cabal/dhall-to-cabal.dhall view
@@ -1,6 +1,6 @@- let prelude = ./dhall/prelude.dhall + let prelude = ../../dhall/prelude.dhall -in let types = ./dhall/types.dhall +in let types = ../../dhall/types.dhall in let v = prelude.v
golden-tests/dhall-to-cabal/empty-package.dhall view
@@ -1,14 +1,14 @@- ./dhall/defaults/Package.dhall + ../../dhall/defaults/Package.dhall ⫽ { name = "Name" , version =- ./dhall/Version/v.dhall "1"+ ../../dhall/Version/v.dhall "1" , executables = [ { name = "foo" , executable =- λ(config : ./dhall/types/Config.dhall)- → ./dhall/defaults/Executable.dhall+ λ(config : ../../dhall/types/Config.dhall)+ → ../../dhall/defaults/Executable.dhall ⫽ { main-is = "Main.hs" } } ]
golden-tests/dhall-to-cabal/gh-53.dhall view
@@ -1,6 +1,6 @@- let prelude = ./dhall/prelude.dhall+ let prelude = ../../dhall/prelude.dhall -in let types = ./dhall/types.dhall+in let types = ../../dhall/types.dhall in prelude.defaults.Package ⫽ { cabal-version =
golden-tests/dhall-to-cabal/gh-55.dhall view
@@ -1,6 +1,6 @@- let prelude = ./dhall/prelude.dhall+ let prelude = ../../dhall/prelude.dhall -in let types = ./dhall/types.dhall+in let types = ../../dhall/types.dhall in let v = prelude.v @@ -8,11 +8,11 @@ \ ( cfg : types.Config ) -> \ ( ver : types.VersionRange ) -> cfg.impl ( prelude.types.Compilers.GHC {=} ) ver -in ./dhall/defaults/Package.dhall+in ../../dhall/defaults/Package.dhall // { name = "Name" , version =- ./dhall/Version/v.dhall "1"+ ../../dhall/Version/v.dhall "1" , library = [ \ ( config : types.Config ) -> prelude.defaults.Library@@ -27,6 +27,6 @@ ( if ghcImpl config ( prelude.orLaterVersion ( v "7.1.3" ) ) then [ "-DCOND1" ] else [ ] : List Text ) }- ] : Optional ( ./dhall/types/Guarded.dhall types.Library )+ ] : Optional ( ../../dhall/types/Guarded.dhall types.Library ) }
golden-tests/dhall-to-cabal/map-source-repo.dhall view
@@ -1,6 +1,6 @@- let prelude = ./dhall/prelude.dhall+ let prelude = ../../dhall/prelude.dhall -in let types = ./dhall/types.dhall+in let types = ../../dhall/types.dhall in let updateRepo = prelude.utils.mapSourceRepos@@ -24,8 +24,8 @@ [ { name = "foo" , executable =- λ(config : ./dhall/types/Config.dhall)- → ./dhall/defaults/Executable.dhall+ λ(config : ../../dhall/types/Config.dhall)+ → ../../dhall/defaults/Executable.dhall ⫽ { main-is = "Main.hs" } } ]
golden-tests/dhall-to-cabal/nested-conditions.dhall view
@@ -1,5 +1,5 @@- let prelude = ./dhall/prelude.dhall -in let types = ./dhall/types.dhall + let prelude = ../../dhall/prelude.dhall +in let types = ../../dhall/types.dhall in let v = prelude.v in prelude.defaults.Package // { name = "foo"
lib/CabalToDhall.hs view
@@ -1,6 +1,7 @@ {-# language FlexibleInstances #-} {-# language GeneralizedNewtypeDeriving #-} {-# language LambdaCase #-}+{-# language MultiWayIf #-} {-# language NamedFieldPuns #-} {-# language OverloadedStrings #-} {-# language ViewPatterns #-}@@ -8,6 +9,10 @@ module CabalToDhall ( cabalToDhall , parseGenericPackageDescriptionThrows+ , KnownDefault (..)+ , PreludeReference (..)+ , resolvePreludeVar+ , getDefault ) where import Data.Foldable ( foldMap )@@ -106,9 +111,90 @@ genericPackageDescription -type Default s a = Map.InsOrdHashMap StrictText.Text ( Expr.Expr s a )+-- Note: the Show instance is used by --print-type.+data KnownDefault+ = CompilerOptions+ | BuildInfo+ | Library+ | Executable+ | Benchmark+ | TestSuite+ | Package+ | SourceRepo+ deriving ( Bounded, Enum, Eq, Ord, Read, Show ) +data PreludeReference+ = PreludeDefault KnownDefault+ | PreludeConstructorsLicense+ | PreludeConstructorsRepoKind+ | PreludeConstructorsScope+ | PreludeV+++resolvePreludeVar :: PreludeReference -> Expr.Expr s a+resolvePreludeVar = \case+ PreludeDefault typ ->+ Expr.Var "prelude" `Expr.Field` "defaults" `Expr.Field` StrictText.pack ( show typ )+ PreludeV ->+ Expr.Var "prelude" `Expr.Field` "v"+ PreludeConstructorsLicense ->+ Expr.Var "prelude" `Expr.Field` "types" `Expr.Field` "Licenses"+ PreludeConstructorsRepoKind ->+ Expr.Var "prelude" `Expr.Field` "types" `Expr.Field` "RepoKind"+ PreludeConstructorsScope ->+ Expr.Var "prelude" `Expr.Field` "types" `Expr.Field` "Scopes"+++type Default s a+ = ( PreludeReference -> Expr.Expr s a )+ -> Map.InsOrdHashMap StrictText.Text ( Expr.Expr s a )+++getDefault+ :: ( Eq s )+ => Dhall.Core.Import+ -> ( PreludeReference -> Expr.Expr s Dhall.Core.Import )+ -> KnownDefault+ -> Expr.Expr s Dhall.Core.Import+getDefault typesLoc resolve typ = withTypesImport expr+ where+ withTypesImport =+ Expr.Let "types" Nothing ( Expr.Embed typesLoc )++ factorBuildInfo fields =+ let+ shared = Map.filter id ( Map.intersectionWith (==) fields ( buildInfoDefault resolve ) )+ in+ if | null shared+ -> Expr.RecordLit fields+ | null ( Map.difference fields shared )+ -> resolve ( PreludeDefault BuildInfo )+ | otherwise+ -> Expr.Prefer+ ( resolve ( PreludeDefault BuildInfo ) )+ ( Expr.RecordLit ( Map.difference fields shared ) )++ expr =+ case typ of+ CompilerOptions ->+ Expr.RecordLit ( compilerOptionsDefault resolve )+ BuildInfo ->+ Expr.RecordLit ( buildInfoDefault resolve )+ Library ->+ factorBuildInfo ( libraryDefault resolve )+ Executable ->+ factorBuildInfo ( executableDefault resolve )+ Benchmark ->+ factorBuildInfo ( benchmarkDefault resolve )+ TestSuite ->+ factorBuildInfo ( testSuiteDefault resolve )+ Package ->+ Expr.RecordLit ( packageDefault resolve )+ SourceRepo ->+ Expr.RecordLit ( sourceRepoDefault resolve )++ emptyListDefault :: StrictText.Text -> Expr.Expr s a@@ -135,8 +221,12 @@ ) +generaliseDeclared =+ Dhall.Core.denote . fmap Dhall.TypeCheck.absurd . Dhall.declared++ compilerOptionsDefault :: Default s a-compilerOptionsDefault =+compilerOptionsDefault _resolve = ( Map.fromList [ emptyListDefault "GHC" Expr.Text , emptyListDefault "GHCJS" Expr.Text@@ -152,81 +242,86 @@ ) -buildInfoDefault :: Default Dhall.Parser.Src Dhall.TypeCheck.X-buildInfoDefault = Map.fromList- [ emptyListDefault "autogen-modules" Expr.Text- , emptyListDefault "build-depends" ( Dhall.declared dependency )- , emptyListDefault "build-tool-depends" ( Dhall.declared exeDependency )- , emptyListDefault "build-tools" ( Dhall.declared legacyExeDependency )- , ( "buildable", Expr.BoolLit True )- , emptyListDefault "c-sources" Expr.Text- , emptyListDefault "cc-options" Expr.Text- , ( "compiler-options", Expr.Var "prelude" `Expr.Field` "defaults" `Expr.Field` "CompilerOptions" )- , emptyListDefault "cpp-options" Expr.Text- , emptyListDefault "default-extensions" ( Dhall.declared extension )- , emptyOptionalDefault "default-language" ( Dhall.declared language )- , emptyListDefault "extra-framework-dirs" Expr.Text- , emptyListDefault "extra-ghci-libraries" Expr.Text- , emptyListDefault "extra-lib-dirs" Expr.Text- , emptyListDefault "extra-libraries" Expr.Text- , emptyListDefault "frameworks" Expr.Text- , emptyListDefault "hs-source-dirs" Expr.Text- , emptyListDefault "includes" Expr.Text- , emptyListDefault "include-dirs" Expr.Text- , emptyListDefault "install-includes" Expr.Text- , emptyListDefault "js-sources" Expr.Text- , emptyListDefault "ld-options" Expr.Text- , emptyListDefault "other-extensions" ( Dhall.declared extension )- , emptyListDefault "other-languages" ( Dhall.declared language )- , emptyListDefault "other-modules" Expr.Text- , emptyListDefault "pkgconfig-depends" ( Dhall.declared pkgconfigDependency )- , ( "profiling-options", Expr.Var "prelude" `Expr.Field` "defaults" `Expr.Field` "CompilerOptions" )- , ( "shared-options", Expr.Var "prelude" `Expr.Field` "defaults" `Expr.Field` "CompilerOptions" )- , ( "static-options", Expr.Var "prelude" `Expr.Field` "defaults" `Expr.Field` "CompilerOptions" )- , emptyListDefault "mixins" ( Dhall.declared mixin )- , emptyListDefault "asm-options" Expr.Text- , emptyListDefault "asm-sources" Expr.Text- , emptyListDefault "cmm-options" Expr.Text- , emptyListDefault "cmm-sources" Expr.Text- , emptyListDefault "cxx-options" Expr.Text- , emptyListDefault "cxx-sources" Expr.Text- , emptyListDefault "virtual-modules" Expr.Text- , emptyListDefault "extra-lib-flavours" Expr.Text- , emptyListDefault "extra-bundled-libs" Expr.Text- ]+buildInfoDefault :: Default s a+buildInfoDefault resolve = fields+ where+ fields = Map.fromList+ [ emptyListDefault "autogen-modules" Expr.Text+ , emptyListDefault "build-depends" ( generaliseDeclared dependency )+ , emptyListDefault "build-tool-depends" ( generaliseDeclared exeDependency )+ , emptyListDefault "build-tools"+ ( generaliseDeclared legacyExeDependency )+ , ( "buildable", Expr.BoolLit True )+ , emptyListDefault "c-sources" Expr.Text+ , emptyListDefault "cc-options" Expr.Text+ , ( "compiler-options", resolve ( PreludeDefault CompilerOptions ) )+ , emptyListDefault "cpp-options" Expr.Text+ , emptyListDefault "default-extensions" ( generaliseDeclared extension )+ , emptyOptionalDefault "default-language" ( generaliseDeclared language )+ , emptyListDefault "extra-framework-dirs" Expr.Text+ , emptyListDefault "extra-ghci-libraries" Expr.Text+ , emptyListDefault "extra-lib-dirs" Expr.Text+ , emptyListDefault "extra-libraries" Expr.Text+ , emptyListDefault "frameworks" Expr.Text+ , emptyListDefault "hs-source-dirs" Expr.Text+ , emptyListDefault "includes" Expr.Text+ , emptyListDefault "include-dirs" Expr.Text+ , emptyListDefault "install-includes" Expr.Text+ , emptyListDefault "js-sources" Expr.Text+ , emptyListDefault "ld-options" Expr.Text+ , emptyListDefault "other-extensions" ( generaliseDeclared extension )+ , emptyListDefault "other-languages" ( generaliseDeclared language )+ , emptyListDefault "other-modules" Expr.Text+ , emptyListDefault "pkgconfig-depends" ( generaliseDeclared pkgconfigDependency )+ , ( "profiling-options", resolve ( PreludeDefault CompilerOptions ) )+ , ( "shared-options", resolve ( PreludeDefault CompilerOptions ) )+ , ( "static-options", resolve ( PreludeDefault CompilerOptions ) )+ , emptyListDefault "mixins" ( generaliseDeclared mixin )+ , emptyListDefault "asm-options" Expr.Text+ , emptyListDefault "asm-sources" Expr.Text+ , emptyListDefault "cmm-options" Expr.Text+ , emptyListDefault "cmm-sources" Expr.Text+ , emptyListDefault "cxx-options" Expr.Text+ , emptyListDefault "cxx-sources" Expr.Text+ , emptyListDefault "virtual-modules" Expr.Text+ , emptyListDefault "extra-lib-flavours" Expr.Text+ , emptyListDefault "extra-bundled-libs" Expr.Text+ ] -libraryDefault :: Default Dhall.Parser.Src Dhall.TypeCheck.X-libraryDefault = buildInfoDefault <> specificFields+libraryDefault :: Default s a+libraryDefault resolve = buildInfoDefault resolve <> specificFields where specificFields = Map.fromList [ emptyListDefault "exposed-modules" Expr.Text , emptyListDefault "other-modules" Expr.Text- , emptyListDefault "reexported-modules" ( Dhall.declared moduleReexport )+ , emptyListDefault "reexported-modules"+ ( generaliseDeclared moduleReexport ) , emptyListDefault "signatures" Expr.Text ] -benchmarkDefault :: Default Dhall.Parser.Src Dhall.TypeCheck.X+benchmarkDefault :: Default s a benchmarkDefault = buildInfoDefault -testSuiteDefault :: Default Dhall.Parser.Src Dhall.TypeCheck.X+testSuiteDefault :: Default s a testSuiteDefault = buildInfoDefault -executableDefault :: Default Dhall.Parser.Src Dhall.TypeCheck.X-executableDefault = buildInfoDefault <> specificFields+executableDefault :: Default s a+executableDefault resolve = buildInfoDefault resolve <> specificFields where specificFields = Map.singleton "scope"- ( Expr.UnionLit "Public" ( Expr.RecordLit mempty )- ( Map.singleton "Private" ( Expr.Record mempty ) )+ ( Expr.App+ ( resolve PreludeConstructorsScope `Expr.Field` "Public" )+ ( Expr.RecordLit mempty ) ) -packageDefault :: Default Dhall.Parser.Src Dhall.TypeCheck.X-packageDefault = fields+packageDefault :: Default s a+packageDefault resolve = fields where named name typ = Expr.Record ( Map.fromList@@ -237,20 +332,21 @@ , Expr.Pi "config" ( Expr.Var "types" `Expr.Field` "Config" )- ( Dhall.declared typ )+ ( generaliseDeclared typ ) ) ] ) fields = Map.fromList [ textFieldDefault "author" ""- , emptyListDefault "flags" ( Dhall.declared flag )+ , emptyListDefault "flags" ( generaliseDeclared flag ) , emptyListDefault "benchmarks" ( named "benchmark" benchmark ) , textFieldDefault "bug-reports" ""- , emptyOptionalDefault "build-type" ( Dhall.declared buildType )+ , emptyOptionalDefault "build-type"+ ( generaliseDeclared buildType ) , ( "cabal-version" , Expr.App- ( Expr.Var "prelude" `Expr.Field` "v" )+ ( resolve PreludeV ) ( Expr.TextLit ( Dhall.Core.Chunks [] "2.2" ) ) ) , textFieldDefault "category" ""@@ -268,17 +364,17 @@ ( Expr.Pi "config" ( Expr.Var "types" `Expr.Field` "Config" )- ( Dhall.declared library )+ ( generaliseDeclared library ) ) , ( "license" , Expr.App- ( Expr.Var "prelude" `Expr.Field` "types" `Expr.Field` "Licenses" `Expr.Field` "AllRightsReserved" )+ ( resolve PreludeConstructorsLicense `Expr.Field` "AllRightsReserved" ) ( Expr.RecordLit mempty ) ) , emptyListDefault "license-files" Expr.Text , textFieldDefault "maintainer" "" , textFieldDefault "package-url" ""- , emptyListDefault "source-repos" ( Dhall.declared sourceRepo )+ , emptyListDefault "source-repos" ( generaliseDeclared sourceRepo ) , textFieldDefault "stability" "" , emptyListDefault "sub-libraries" ( named "library" library ) , textFieldDefault "synopsis" ""@@ -286,8 +382,8 @@ , emptyListDefault "tested-with" ( Expr.Record ( Map.fromList- [ ( "compiler", Dhall.declared compilerFlavor )- , ( "version", Dhall.declared versionRange )+ [ ( "compiler", generaliseDeclared compilerFlavor )+ , ( "version", generaliseDeclared versionRange ) ] ) )@@ -297,15 +393,16 @@ [ ( "_1", Expr.Text ), ( "_2", Expr.Text ) ] ) )- , emptyOptionalDefault "custom-setup" ( Dhall.declared setupBuildInfo )+ , emptyOptionalDefault "custom-setup"+ ( generaliseDeclared setupBuildInfo ) ] -sourceRepoDefault :: Default Dhall.Parser.Src Dhall.TypeCheck.X-sourceRepoDefault = fields+sourceRepoDefault :: Default s a+sourceRepoDefault resolve = fields where fields = Map.fromList- [ emptyOptionalDefault "type" ( Dhall.declared repoType )+ [ emptyOptionalDefault "type" ( generaliseDeclared repoType ) , emptyOptionalDefault "location" Expr.Text , emptyOptionalDefault "module" Expr.Text , emptyOptionalDefault "branch" Expr.Text@@ -313,7 +410,7 @@ , emptyOptionalDefault "subdir" Expr.Text , ( "kind" , Expr.App- ( Expr.Var "prelude" `Expr.Field` "types" `Expr.Field` "RepoKind" `Expr.Field` "RepoHead" )+ ( resolve PreludeConstructorsRepoKind `Expr.Field` "RepoHead" ) ( Expr.RecordLit mempty ) ) ]@@ -355,10 +452,11 @@ DefaultComparisonReplace expr -withDefault :: ( Eq a ) => StrictText.Text -> Default s a -> Expr.Expr s a -> Expr.Expr s a-withDefault name defs ( Expr.RecordLit fields ) =+withDefault :: ( Eq a ) => KnownDefault -> Default s a -> Expr.Expr s a -> Expr.Expr s a+withDefault typ defs ( Expr.RecordLit fields ) = let- nonDefaults = nonDefaultFields defs fields+ nonDefaults = nonDefaultFields ( defs resolvePreludeVar ) fields+ name = StrictText.pack ( show typ ) in if null nonDefaults then Expr.Var ( Expr.V "prelude" 0 ) `Expr.Field` "defaults" `Expr.Field` name@@ -396,12 +494,12 @@ } -runRecordInputTypeWithDefault :: StrictText.Text -> Default Dhall.Parser.Src Dhall.TypeCheck.X -> RecordInputType a -> Dhall.InputType a-runRecordInputTypeWithDefault defName def m =+runRecordInputTypeWithDefault :: KnownDefault -> Default Dhall.Parser.Src Dhall.TypeCheck.X -> RecordInputType a -> Dhall.InputType a+runRecordInputTypeWithDefault typ def m = let Dhall.InputType embed declared = runRecordInputType m in- Dhall.InputType ( withDefault defName def . embed ) declared+ Dhall.InputType ( withDefault typ def . embed ) declared genericPackageDescriptionToDhall@@ -419,7 +517,7 @@ ) in- runRecordInputTypeWithDefault "Package" packageDefault+ runRecordInputTypeWithDefault Package packageDefault ( mconcat [ Cabal.packageDescription >$< packageDescriptionToRecord , recordField "flags" ( Cabal.genPackageFlags >$< ( listOf flag ) )@@ -823,17 +921,21 @@ sourceRepo :: Dhall.InputType Cabal.SourceRepo sourceRepo =- runRecordInputTypeWithDefault "SourceRepo" sourceRepoDefault- ( mconcat- [ recordField "kind" ( contramap Cabal.repoKind repoKind )- , recordField "type" ( contramap Cabal.repoType ( maybeToDhall repoType ) )- , recordField "location" ( contramap Cabal.repoLocation ( maybeToDhall stringToDhall ) )- , recordField "module" ( contramap Cabal.repoModule ( maybeToDhall stringToDhall ) )- , recordField "branch" ( contramap Cabal.repoBranch ( maybeToDhall stringToDhall ) )- , recordField "tag" ( contramap Cabal.repoTag ( maybeToDhall stringToDhall ) )- , recordField "subdir" ( contramap Cabal.repoSubdir ( maybeToDhall stringToDhall ) )- ]- )+ ( runRecordInputTypeWithDefault SourceRepo sourceRepoDefault+ ( mconcat+ [ recordField "kind" ( contramap Cabal.repoKind repoKind )+ , recordField "type" ( contramap Cabal.repoType ( maybeToDhall repoType ) )+ , recordField "location" ( contramap Cabal.repoLocation ( maybeToDhall stringToDhall ) )+ , recordField "module" ( contramap Cabal.repoModule ( maybeToDhall stringToDhall ) )+ , recordField "branch" ( contramap Cabal.repoBranch ( maybeToDhall stringToDhall ) )+ , recordField "tag" ( contramap Cabal.repoTag ( maybeToDhall stringToDhall ) )+ , recordField "subdir" ( contramap Cabal.repoSubdir ( maybeToDhall stringToDhall ) )+ ]+ )+ )+ { Dhall.declared =+ Expr.Var "types" `Expr.Field` "SourceRepo"+ } repoKind :: Dhall.InputType Cabal.RepoKind@@ -968,7 +1070,7 @@ library :: Dhall.InputType Cabal.Library library =- ( runRecordInputTypeWithDefault "Library" libraryDefault+ ( runRecordInputTypeWithDefault Library libraryDefault ( mconcat [ contramap Cabal.libBuildInfo buildInfoRecord , recordField@@ -1349,7 +1451,7 @@ compilerOptions = Dhall.InputType { Dhall.embed = \xs ->- withDefault "CompilerOptions" compilerOptionsDefault+ withDefault CompilerOptions compilerOptionsDefault ( Expr.RecordLit ( Map.fromList ( map@@ -1407,7 +1509,7 @@ benchmark :: Dhall.InputType Cabal.Benchmark benchmark =- ( runRecordInputTypeWithDefault "Benchmark" benchmarkDefault+ ( runRecordInputTypeWithDefault Benchmark benchmarkDefault ( mconcat [ recordField "main-is" ( ( \( Cabal.BenchmarkExeV10 _ s ) -> s ) . Cabal.benchmarkInterface >$< stringToDhall ) , Cabal.benchmarkBuildInfo >$< buildInfoRecord@@ -1421,7 +1523,7 @@ testSuite :: Dhall.InputType Cabal.TestSuite testSuite =- ( runRecordInputTypeWithDefault "TestSuite" testSuiteDefault+ ( runRecordInputTypeWithDefault TestSuite testSuiteDefault ( mconcat [ recordField "type" ( Cabal.testInterface >$< testSuiteInterface ) , Cabal.testBuildInfo >$< buildInfoRecord@@ -1465,7 +1567,7 @@ executable :: Dhall.InputType Cabal.Executable executable =- ( runRecordInputTypeWithDefault "Executable" executableDefault+ ( runRecordInputTypeWithDefault Executable executableDefault ( mconcat [ recordField "main-is" ( Cabal.modulePath >$< stringToDhall ) , recordField "scope" ( Cabal.exeScope >$< executableScope )@@ -1480,19 +1582,19 @@ executableScope :: Dhall.InputType Cabal.ExecutableScope executableScope =- runUnion- ( mconcat- [ unionAlt- "Public"- ( \x ->- case x of- Cabal.ExecutablePublic -> Just ()- _ -> Nothing- )- Dhall.inject- , unionAlt "Private" ( \x -> case x of Cabal.ExecutablePrivate -> Just () ; _ -> Nothing ) Dhall.inject- ]- )+ Dhall.InputType+ { Dhall.embed = \case+ Cabal.ExecutablePublic ->+ Expr.App+ ( Expr.Var "prelude" `Expr.Field` "types" `Expr.Field` "Scopes" `Expr.Field` "Public" )+ ( Expr.RecordLit mempty )+ Cabal.ExecutablePrivate ->+ Expr.App+ ( Expr.Var "prelude" `Expr.Field` "types" `Expr.Field` "scopes" `Expr.Field` "Private" )+ ( Expr.RecordLit mempty )+ , Dhall.declared =+ Expr.Var "types" `Expr.Field` "Scope"+ } foreignLibrary :: Dhall.InputType Cabal.ForeignLib
lib/Dhall/Extra.hs view
@@ -5,20 +5,13 @@ {-# language RecordWildCards #-} module Dhall.Extra- ( RecordBuilder- , keyValue- , makeRecord- , makeUnion+ ( makeUnion , validateType , sortExpr ) where -import Control.Applicative ( Const(..) ) import Control.Monad ( join )-import Control.Monad.Trans.Reader ( Reader, reader, runReader )-import Data.Functor.Compose ( Compose(..) )-import Data.Functor.Product ( Product(..) ) import Data.Hashable ( Hashable ) import Data.List ( sortBy ) import Data.Ord ( comparing )@@ -28,61 +21,6 @@ import qualified Dhall import qualified Dhall.Core as Dhall ( Expr ) import qualified Dhall.Core as Expr ( Expr(..) )-import qualified Dhall.Parser-import qualified Dhall.TypeCheck ----newtype RecordBuilder a =- RecordBuilder- ( Product- ( Const- ( Map.InsOrdHashMap- StrictText.Text- ( Dhall.Expr Dhall.Parser.Src Dhall.TypeCheck.X )- )- )- ( Compose- ( Reader- ( Dhall.Expr Dhall.Parser.Src Dhall.TypeCheck.X )- )- Maybe- )- a- )- deriving (Functor, Applicative)----makeRecord :: RecordBuilder a -> Dhall.Type a-makeRecord ( RecordBuilder ( Pair ( Const fields ) ( Compose extractF ) ) ) =- let- extract =- runReader extractF-- expected =- sortExpr ( Expr.Record fields )-- in Dhall.Type { .. }----keyValue :: StrictText.Text -> Dhall.Type a -> RecordBuilder a-keyValue key valueType =- let- extract expr = do- Expr.RecordLit fields <-- return expr-- Map.lookup key fields >>= Dhall.extract valueType-- in- RecordBuilder- ( Pair- ( Const ( Map.singleton key ( Dhall.expected valueType ) ) )- ( Compose ( reader extract ) )- )- makeUnion :: Map.InsOrdHashMap StrictText.Text ( Dhall.Type a ) -> Dhall.Type a
lib/DhallToCabal.hs view
@@ -82,13 +82,13 @@ -packageIdentifier :: RecordBuilder Cabal.PackageIdentifier+packageIdentifier :: Dhall.RecordType Cabal.PackageIdentifier packageIdentifier = do pkgName <-- keyValue "name" packageName+ Dhall.field "name" packageName pkgVersion <-- keyValue "version" version+ Dhall.field "version" version pure Cabal.PackageIdentifier { .. } @@ -100,7 +100,7 @@ -packageDescription :: RecordBuilder Cabal.PackageDescription+packageDescription :: Dhall.RecordType Cabal.PackageDescription packageDescription = do package <- packageIdentifier@@ -124,57 +124,57 @@ pure Nothing customFieldsPD <-- keyValue+ Dhall.field "x-fields" ( Dhall.list ( Dhall.pair Dhall.string Dhall.string ) ) sourceRepos <-- keyValue "source-repos" ( Dhall.list sourceRepo )+ Dhall.field "source-repos" ( Dhall.list sourceRepo ) specVersionRaw <-- Left <$> keyValue "cabal-version" version+ Left <$> Dhall.field "cabal-version" version buildTypeRaw <-- keyValue "build-type" ( Dhall.maybe buildType )+ Dhall.field "build-type" ( Dhall.maybe buildType ) licenseRaw <-- keyValue "license" license+ Dhall.field "license" license licenseFiles <-- keyValue "license-files" ( Dhall.list Dhall.string )+ Dhall.field "license-files" ( Dhall.list Dhall.string ) copyright <-- keyValue "copyright" Dhall.string+ Dhall.field "copyright" Dhall.string maintainer <-- keyValue "maintainer" Dhall.string+ Dhall.field "maintainer" Dhall.string author <-- keyValue "author" Dhall.string+ Dhall.field "author" Dhall.string stability <-- keyValue "stability" Dhall.string+ Dhall.field "stability" Dhall.string testedWith <-- keyValue "tested-with" ( Dhall.list compiler )+ Dhall.field "tested-with" ( Dhall.list compiler ) homepage <-- keyValue "homepage" Dhall.string+ Dhall.field "homepage" Dhall.string pkgUrl <-- keyValue "package-url" Dhall.string+ Dhall.field "package-url" Dhall.string bugReports <-- keyValue "bug-reports" Dhall.string+ Dhall.field "bug-reports" Dhall.string synopsis <-- keyValue "synopsis" Dhall.string+ Dhall.field "synopsis" Dhall.string description <-- keyValue "description" Dhall.string+ Dhall.field "description" Dhall.string category <-- keyValue "category" Dhall.string+ Dhall.field "category" Dhall.string -- Cabal documentation states --@@ -185,22 +185,22 @@ pure [] setupBuildInfo <-- keyValue "custom-setup" ( Dhall.maybe setupBuildInfo )+ Dhall.field "custom-setup" ( Dhall.maybe setupBuildInfo ) dataFiles <-- keyValue "data-files" ( Dhall.list Dhall.string )+ Dhall.field "data-files" ( Dhall.list Dhall.string ) dataDir <-- keyValue "data-dir" Dhall.string+ Dhall.field "data-dir" Dhall.string extraSrcFiles <-- keyValue "extra-source-files" ( Dhall.list Dhall.string )+ Dhall.field "extra-source-files" ( Dhall.list Dhall.string ) extraTmpFiles <-- keyValue "extra-tmp-files" ( Dhall.list Dhall.string )+ Dhall.field "extra-tmp-files" ( Dhall.list Dhall.string ) extraDocFiles <-- keyValue "extra-doc-files" ( Dhall.list Dhall.string )+ Dhall.field "extra-doc-files" ( Dhall.list Dhall.string ) return ( adjustUnspecifiedLicense Cabal.PackageDescription { .. } ) @@ -257,9 +257,9 @@ benchmark :: Dhall.Type Cabal.Benchmark benchmark =- makeRecord $ do+ Dhall.record $ do mainIs <-- keyValue "main-is" Dhall.string+ Dhall.field "main-is" Dhall.string benchmarkName <- pure ""@@ -276,142 +276,142 @@ -buildInfo :: RecordBuilder Cabal.BuildInfo+buildInfo :: Dhall.RecordType Cabal.BuildInfo buildInfo = do buildable <-- keyValue "buildable" Dhall.bool+ Dhall.field "buildable" Dhall.bool buildTools <-- keyValue "build-tools" ( Dhall.list legacyExeDependency )+ Dhall.field "build-tools" ( Dhall.list legacyExeDependency ) buildToolDepends <-- keyValue "build-tool-depends" ( Dhall.list exeDependency )+ Dhall.field "build-tool-depends" ( Dhall.list exeDependency ) cppOptions <-- keyValue "cpp-options" ( Dhall.list Dhall.string )+ Dhall.field "cpp-options" ( Dhall.list Dhall.string ) ccOptions <-- keyValue "cc-options" ( Dhall.list Dhall.string )+ Dhall.field "cc-options" ( Dhall.list Dhall.string ) ldOptions <-- keyValue "ld-options" ( Dhall.list Dhall.string )+ Dhall.field "ld-options" ( Dhall.list Dhall.string ) pkgconfigDepends <-- keyValue "pkgconfig-depends" ( Dhall.list pkgconfigDependency )+ Dhall.field "pkgconfig-depends" ( Dhall.list pkgconfigDependency ) frameworks <-- keyValue "frameworks" ( Dhall.list Dhall.string )+ Dhall.field "frameworks" ( Dhall.list Dhall.string ) extraFrameworkDirs <-- keyValue "extra-framework-dirs" ( Dhall.list Dhall.string )+ Dhall.field "extra-framework-dirs" ( Dhall.list Dhall.string ) cSources <-- keyValue "c-sources" ( Dhall.list Dhall.string )+ Dhall.field "c-sources" ( Dhall.list Dhall.string ) jsSources <-- keyValue "js-sources" ( Dhall.list Dhall.string )+ Dhall.field "js-sources" ( Dhall.list Dhall.string ) hsSourceDirs <-- keyValue "hs-source-dirs" ( Dhall.list Dhall.string )+ Dhall.field "hs-source-dirs" ( Dhall.list Dhall.string ) otherModules <-- keyValue "other-modules" ( Dhall.list moduleName )+ Dhall.field "other-modules" ( Dhall.list moduleName ) autogenModules <-- keyValue "autogen-modules" ( Dhall.list moduleName )+ Dhall.field "autogen-modules" ( Dhall.list moduleName ) defaultLanguage <-- keyValue "default-language" ( Dhall.maybe language )+ Dhall.field "default-language" ( Dhall.maybe language ) otherLanguages <-- keyValue "other-languages" ( Dhall.list language )+ Dhall.field "other-languages" ( Dhall.list language ) defaultExtensions <-- keyValue "default-extensions" ( Dhall.list extension )+ Dhall.field "default-extensions" ( Dhall.list extension ) otherExtensions <-- keyValue "other-extensions" ( Dhall.list extension )+ Dhall.field "other-extensions" ( Dhall.list extension ) oldExtensions <- pure [] extraLibs <-- keyValue "extra-libraries" ( Dhall.list Dhall.string )+ Dhall.field "extra-libraries" ( Dhall.list Dhall.string ) extraGHCiLibs <-- keyValue "extra-ghci-libraries" ( Dhall.list Dhall.string )+ Dhall.field "extra-ghci-libraries" ( Dhall.list Dhall.string ) extraLibDirs <-- keyValue "extra-lib-dirs" ( Dhall.list Dhall.string )+ Dhall.field "extra-lib-dirs" ( Dhall.list Dhall.string ) includeDirs <-- keyValue "include-dirs" ( Dhall.list Dhall.string )+ Dhall.field "include-dirs" ( Dhall.list Dhall.string ) includes <-- keyValue "includes" ( Dhall.list Dhall.string )+ Dhall.field "includes" ( Dhall.list Dhall.string ) installIncludes <-- keyValue "install-includes" ( Dhall.list Dhall.string )+ Dhall.field "install-includes" ( Dhall.list Dhall.string ) options <-- keyValue "compiler-options" compilerOptions+ Dhall.field "compiler-options" compilerOptions profOptions <-- keyValue "profiling-options" compilerOptions+ Dhall.field "profiling-options" compilerOptions sharedOptions <-- keyValue "shared-options" compilerOptions+ Dhall.field "shared-options" compilerOptions staticOptions <-- keyValue "static-options" compilerOptions+ Dhall.field "static-options" compilerOptions customFieldsBI <- pure [] targetBuildDepends <-- keyValue "build-depends" ( Dhall.list dependency )+ Dhall.field "build-depends" ( Dhall.list dependency ) mixins <-- keyValue "mixins" ( Dhall.list mixin )+ Dhall.field "mixins" ( Dhall.list mixin ) asmOptions <-- keyValue "asm-options" ( Dhall.list Dhall.string )+ Dhall.field "asm-options" ( Dhall.list Dhall.string ) asmSources <-- keyValue "asm-sources" ( Dhall.list Dhall.string )+ Dhall.field "asm-sources" ( Dhall.list Dhall.string ) cmmOptions <-- keyValue "cmm-options" ( Dhall.list Dhall.string )+ Dhall.field "cmm-options" ( Dhall.list Dhall.string ) cmmSources <-- keyValue "cmm-sources" ( Dhall.list Dhall.string )+ Dhall.field "cmm-sources" ( Dhall.list Dhall.string ) cxxOptions <-- keyValue "cxx-options" ( Dhall.list Dhall.string )+ Dhall.field "cxx-options" ( Dhall.list Dhall.string ) cxxSources <-- keyValue "cxx-sources" ( Dhall.list Dhall.string )+ Dhall.field "cxx-sources" ( Dhall.list Dhall.string ) virtualModules <-- keyValue "virtual-modules" ( Dhall.list moduleName )+ Dhall.field "virtual-modules" ( Dhall.list moduleName ) extraLibFlavours <-- keyValue "extra-lib-flavours" ( Dhall.list Dhall.string )+ Dhall.field "extra-lib-flavours" ( Dhall.list Dhall.string ) extraBundledLibs <-- keyValue "extra-bundled-libs" ( Dhall.list Dhall.string )+ Dhall.field "extra-bundled-libs" ( Dhall.list Dhall.string ) return Cabal.BuildInfo { .. } buildInfoType :: Expr.Expr Dhall.Parser.Src Dhall.TypeCheck.X buildInfoType =- Dhall.expected ( makeRecord buildInfo )+ Dhall.expected ( Dhall.record buildInfo ) testSuite :: Dhall.Type Cabal.TestSuite testSuite =- makeRecord $ do+ Dhall.record $ do testName <- pure "" @@ -419,7 +419,7 @@ buildInfo testInterface <-- keyValue "type" testSuiteInterface+ Dhall.field "type" testSuiteInterface pure Cabal.TestSuite@@ -434,11 +434,11 @@ ( Map.fromList [ ( "exitcode-stdio" , Cabal.TestSuiteExeV10 ( Cabal.mkVersion [ 1, 0 ] )- <$> makeRecord ( keyValue "main-is" Dhall.string )+ <$> Dhall.record ( Dhall.field "main-is" Dhall.string ) ) , ( "detailed" , Cabal.TestSuiteLibV09 ( Cabal.mkVersion [ 0, 9 ] )- <$> makeRecord ( keyValue "module" moduleName )+ <$> Dhall.record ( Dhall.field "module" moduleName ) ) ] )@@ -454,15 +454,15 @@ executable :: Dhall.Type Cabal.Executable executable =- makeRecord $ do+ Dhall.record $ do exeName <- pure "" modulePath <-- keyValue "main-is" Dhall.string+ Dhall.field "main-is" Dhall.string exeScope <-- keyValue "scope" executableScope+ Dhall.field "scope" executableScope buildInfo <- buildInfo@@ -473,27 +473,27 @@ foreignLib :: Dhall.Type Cabal.ForeignLib foreignLib =- makeRecord $ do+ Dhall.record $ do foreignLibName <- pure "" foreignLibType <-- keyValue "type" foreignLibType+ Dhall.field "type" foreignLibType foreignLibOptions <-- keyValue "options" ( Dhall.list foreignLibOption )+ Dhall.field "options" ( Dhall.list foreignLibOption ) foreignLibBuildInfo <- buildInfo foreignLibVersionInfo <-- keyValue "lib-version-info" ( Dhall.maybe versionInfo )+ Dhall.field "lib-version-info" ( Dhall.maybe versionInfo ) foreignLibVersionLinux <-- keyValue "lib-version-linux" ( Dhall.maybe version )+ Dhall.field "lib-version-linux" ( Dhall.maybe version ) foreignLibModDefFile <-- keyValue "mod-def-files" ( Dhall.list Dhall.string )+ Dhall.field "mod-def-files" ( Dhall.list Dhall.string ) pure Cabal.ForeignLib { .. } @@ -512,7 +512,7 @@ library :: Dhall.Type Cabal.Library library =- makeRecord $ do+ Dhall.record $ do libName <- pure Nothing @@ -520,13 +520,13 @@ buildInfo exposedModules <-- keyValue "exposed-modules" ( Dhall.list moduleName )+ Dhall.field "exposed-modules" ( Dhall.list moduleName ) reexportedModules <-- keyValue "reexported-modules" ( Dhall.list moduleReexport )+ Dhall.field "reexported-modules" ( Dhall.list moduleReexport ) signatures <-- keyValue "signatures" ( Dhall.list moduleName )+ Dhall.field "signatures" ( Dhall.list moduleName ) libExposed <- pure True@@ -537,27 +537,27 @@ sourceRepo :: Dhall.Type Cabal.SourceRepo sourceRepo =- makeRecord $ do+ Dhall.record $ do repoKind <-- keyValue "kind" repoKind+ Dhall.field "kind" repoKind repoType <-- keyValue "type" ( Dhall.maybe repoType )+ Dhall.field "type" ( Dhall.maybe repoType ) repoLocation <-- keyValue "location" ( Dhall.maybe Dhall.string )+ Dhall.field "location" ( Dhall.maybe Dhall.string ) repoModule <-- keyValue "module" ( Dhall.maybe Dhall.string )+ Dhall.field "module" ( Dhall.maybe Dhall.string ) repoBranch <-- keyValue "branch" ( Dhall.maybe Dhall.string )+ Dhall.field "branch" ( Dhall.maybe Dhall.string ) repoTag <-- keyValue "tag" ( Dhall.maybe Dhall.string )+ Dhall.field "tag" ( Dhall.maybe Dhall.string ) repoSubdir <-- keyValue "subdir" ( Dhall.maybe filePath )+ Dhall.field "subdir" ( Dhall.maybe filePath ) pure Cabal.SourceRepo { .. } @@ -571,12 +571,12 @@ dependency :: Dhall.Type Cabal.Dependency dependency =- makeRecord $ do+ Dhall.record $ do packageName <-- keyValue "package" packageName+ Dhall.field "package" packageName versionRange <-- keyValue "bounds" versionRange+ Dhall.field "bounds" versionRange pure ( Cabal.Dependency packageName versionRange ) @@ -589,9 +589,13 @@ -dhallToCabal :: FilePath -> StrictText.Text -> IO Cabal.GenericPackageDescription-dhallToCabal fileName =- Dhall.inputFrom fileName genericPackageDescription+dhallToCabal+ :: Dhall.InputSettings+ -> StrictText.Text+ -- ^ The Dhall to parse.+ -> IO Cabal.GenericPackageDescription+dhallToCabal settings =+ Dhall.inputWithSettings settings genericPackageDescription @@ -823,10 +827,10 @@ compiler :: Dhall.Type ( Cabal.CompilerFlavor, Cabal.VersionRange ) compiler =- makeRecord $+ Dhall.record $ (,)- <$> keyValue "compiler" compilerFlavor- <*> keyValue "version" versionRange+ <$> Dhall.field "compiler" compilerFlavor+ <*> Dhall.field "version" versionRange @@ -844,12 +848,12 @@ legacyExeDependency :: Dhall.Type Cabal.LegacyExeDependency legacyExeDependency =- makeRecord $ do+ Dhall.record $ do exe <-- keyValue "exe" Dhall.string+ Dhall.field "exe" Dhall.string version <-- keyValue "version" versionRange+ Dhall.field "version" versionRange pure ( Cabal.LegacyExeDependency exe version ) @@ -857,18 +861,18 @@ compilerOptions :: Dhall.Type [ ( Cabal.CompilerFlavor, [ String ] ) ] compilerOptions =- makeRecord $+ Dhall.record $ sequenceA- [ (,) <$> pure Cabal.GHC <*> keyValue "GHC" options- , (,) <$> pure Cabal.GHCJS <*> keyValue "GHCJS" options- , (,) <$> pure Cabal.NHC <*> keyValue "NHC" options- , (,) <$> pure Cabal.YHC <*> keyValue "YHC" options- , (,) <$> pure Cabal.Hugs <*> keyValue "Hugs" options- , (,) <$> pure Cabal.HBC <*> keyValue "HBC" options- , (,) <$> pure Cabal.Helium <*> keyValue "Helium" options- , (,) <$> pure Cabal.JHC <*> keyValue "JHC" options- , (,) <$> pure Cabal.LHC <*> keyValue "LHC" options- , (,) <$> pure Cabal.UHC <*> keyValue "UHC" options+ [ (,) <$> pure Cabal.GHC <*> Dhall.field "GHC" options+ , (,) <$> pure Cabal.GHCJS <*> Dhall.field "GHCJS" options+ , (,) <$> pure Cabal.NHC <*> Dhall.field "NHC" options+ , (,) <$> pure Cabal.YHC <*> Dhall.field "YHC" options+ , (,) <$> pure Cabal.Hugs <*> Dhall.field "Hugs" options+ , (,) <$> pure Cabal.HBC <*> Dhall.field "HBC" options+ , (,) <$> pure Cabal.Helium <*> Dhall.field "Helium" options+ , (,) <$> pure Cabal.JHC <*> Dhall.field "JHC" options+ , (,) <$> pure Cabal.LHC <*> Dhall.field "LHC" options+ , (,) <$> pure Cabal.UHC <*> Dhall.field "UHC" options ] where@@ -880,15 +884,15 @@ exeDependency :: Dhall.Type Cabal.ExeDependency exeDependency =- makeRecord $ do+ Dhall.record $ do packageName <-- keyValue "package" packageName+ Dhall.field "package" packageName component <-- keyValue "component" unqualComponentName+ Dhall.field "component" unqualComponentName version <-- keyValue "version" versionRange+ Dhall.field "version" versionRange pure ( Cabal.ExeDependency packageName component version ) @@ -902,12 +906,12 @@ pkgconfigDependency :: Dhall.Type Cabal.PkgconfigDependency pkgconfigDependency =- makeRecord $ do+ Dhall.record $ do name <-- keyValue "name" pkgconfigName+ Dhall.field "name" pkgconfigName version <-- keyValue "version" versionRange+ Dhall.field "version" versionRange return ( Cabal.PkgconfigDependency name version ) @@ -932,20 +936,20 @@ moduleReexport :: Dhall.Type Cabal.ModuleReexport moduleReexport =- makeRecord $ do+ Dhall.record $ do original <-- keyValue "original" $- makeRecord $ do+ Dhall.field "original" $+ Dhall.record $ do package <-- keyValue "package" ( Dhall.maybe packageName )+ Dhall.field "package" ( Dhall.maybe packageName ) name <-- keyValue "name" moduleName+ Dhall.field "name" moduleName pure ( package, name ) moduleReexportName <-- keyValue "name" moduleName+ Dhall.field "name" moduleName pure Cabal.ModuleReexport@@ -965,12 +969,12 @@ versionInfo :: Dhall.Type Cabal.LibVersionInfo versionInfo =- makeRecord $+ Dhall.record $ fmap Cabal.mkLibVersionInfo $ (,,)- <$> ( fromIntegral <$> keyValue "current" Dhall.natural )- <*> ( fromIntegral <$> keyValue "revision" Dhall.natural )- <*> ( fromIntegral <$> keyValue "age" Dhall.natural )+ <$> ( fromIntegral <$> Dhall.field "current" Dhall.natural )+ <*> ( fromIntegral <$> Dhall.field "revision" Dhall.natural )+ <*> ( fromIntegral <$> Dhall.field "age" Dhall.natural ) @@ -1201,38 +1205,38 @@ let namedList k t = Dhall.list- ( makeRecord+ ( Dhall.record ( (,)- <$> keyValue "name" unqualComponentName- <*> keyValue k ( guarded t )+ <$> Dhall.field "name" unqualComponentName+ <*> Dhall.field k ( guarded t ) ) ) in- makeRecord $ do+ Dhall.record $ do packageDescription <- packageDescription genPackageFlags <-- keyValue "flags" ( Dhall.list flag )+ Dhall.field "flags" ( Dhall.list flag ) condLibrary <-- keyValue "library" ( Dhall.maybe ( guarded library ) )+ Dhall.field "library" ( Dhall.maybe ( guarded library ) ) condSubLibraries <-- keyValue "sub-libraries" ( namedList "library" library )+ Dhall.field "sub-libraries" ( namedList "library" library ) condForeignLibs <-- keyValue "foreign-libraries" ( namedList "foreign-lib" foreignLib )+ Dhall.field "foreign-libraries" ( namedList "foreign-lib" foreignLib ) condExecutables <-- keyValue "executables" ( namedList "executable" executable )+ Dhall.field "executables" ( namedList "executable" executable ) condTestSuites <-- keyValue "test-suites" ( namedList "test-suite" testSuite )+ Dhall.field "test-suites" ( namedList "test-suite" testSuite ) condBenchmarks <-- keyValue "benchmarks" ( namedList "benchmark" benchmark )+ Dhall.field "benchmarks" ( namedList "benchmark" benchmark ) return Cabal.GenericPackageDescription { .. } @@ -1252,18 +1256,18 @@ flag :: Dhall.Type Cabal.Flag flag =- makeRecord $ do+ Dhall.record $ do flagName <-- keyValue "name" flagName+ Dhall.field "name" flagName flagDefault <-- keyValue "default" Dhall.bool+ Dhall.field "default" Dhall.bool flagDescription <-- keyValue "description" Dhall.string+ Dhall.field "description" Dhall.string flagManual <-- keyValue "manual" Dhall.bool+ Dhall.field "manual" Dhall.bool return Cabal.MkFlag { .. } @@ -1277,9 +1281,9 @@ setupBuildInfo :: Dhall.Type Cabal.SetupBuildInfo setupBuildInfo =- makeRecord $ do+ Dhall.record $ do setupDepends <-- keyValue "setup-depends" ( Dhall.list dependency )+ Dhall.field "setup-depends" ( Dhall.list dependency ) defaultSetupDepends <- pure False@@ -1296,12 +1300,12 @@ mixin :: Dhall.Type Cabal.Mixin mixin =- makeRecord $ do+ Dhall.record $ do mixinPackageName <-- keyValue "package" packageName+ Dhall.field "package" packageName mixinIncludeRenaming <-- keyValue "renaming" includeRenaming+ Dhall.field "renaming" includeRenaming pure Cabal.Mixin { .. } @@ -1309,12 +1313,12 @@ includeRenaming :: Dhall.Type Cabal.IncludeRenaming includeRenaming =- makeRecord $ do+ Dhall.record $ do includeProvidesRn <-- keyValue "provides" moduleRenaming+ Dhall.field "provides" moduleRenaming includeRequiresRn <-- keyValue "requires" moduleRenaming+ Dhall.field "requires" moduleRenaming pure Cabal.IncludeRenaming { .. } @@ -1324,8 +1328,8 @@ moduleRenaming = fmap Cabal.ModuleRenaming $ Dhall.list $- makeRecord $- (,) <$> keyValue "rename" moduleName <*> keyValue "to" moduleName+ Dhall.record $+ (,) <$> Dhall.field "rename" moduleName <*> Dhall.field "to" moduleName sortType :: Dhall.Type a -> Dhall.Type a
+ meta/Main.hs view
@@ -0,0 +1,165 @@+{-# language LambdaCase #-}+{-# language OverloadedStrings #-}+{-# language RecordWildCards #-}+{-# language ViewPatterns #-}+module Main+ ( main+ )+ where++import Control.Applicative ( (<**>) )+import Data.Foldable ( for_ )+import Data.String ( fromString )+import System.Directory ( createDirectoryIfMissing )+import System.FilePath+ ( (</>), (<.>), dropTrailingPathSeparator, joinPath, normalise+ , splitDirectories, splitFileName, takeDirectory+ )++import CabalToDhall+ ( KnownDefault, PreludeReference (..), getDefault )++import qualified Data.Text.Prettyprint.Doc as Pretty+import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty+import qualified Dhall.Core+import qualified Dhall.Core as Expr ( Expr(..) )+import qualified Dhall.Parser+import qualified Options.Applicative as OptParse+import qualified System.IO+++data MetaOptions = MetaOptions+ { prefix :: FilePath }+++metaOptionsParser :: OptParse.Parser MetaOptions+metaOptionsParser =+ MetaOptions+ <$>+ OptParse.strOption+ ( mconcat+ [ OptParse.long "prefix"+ , OptParse.value "dhall/"+ , OptParse.metavar "PATH"+ ]+ )+++defaultFile :: KnownDefault -> FilePath+defaultFile typ = "./defaults" </> show typ <.> "dhall"+++-- | Like 'System.FilePath.makeRelative', but will introduce @..@+-- segments (and hence will misbehave in the presence of symlinks).+relativeTo+ :: FilePath+ -- ^ The path to be relative to. Note that the final file-name is+ -- ignored: @foo/bar@ is relative to @foo/@, even if @foo/bar@ is+ -- a directory.+ -> FilePath+ -- ^ The path to relativise.+ -> FilePath+relativeTo =+ \ ( splitDirectories . dropTrailingPathSeparator . takeDirectory . normalise -> base ) ->+ \ ( splitDirectories . normalise -> path ) ->+ joinPath ( go base path )+ where+ go ( a : as ) ( b : bs )+ | a == b = go as bs+ | otherwise = ( ".." <$ ( a : as ) ) ++ ( b : bs )+ go [] bs = bs+ go as [] = ".." <$ as++importFile :: FilePath -> Dhall.Core.Import+importFile ( splitFileName -> ( directory, filename ) ) =+ let+ components =+ fromString <$>+ splitDirectories ( dropTrailingPathSeparator directory )+ in+ Dhall.Core.Import+ { Dhall.Core.importHashed =+ Dhall.Core.ImportHashed+ { Dhall.Core.hash =+ Nothing+ , Dhall.Core.importType =+ Dhall.Core.Local+ Dhall.Core.Here+ ( Dhall.Core.File+ ( Dhall.Core.Directory ( reverse components ) )+ ( fromString filename )+ )+ }+ , Dhall.Core.importMode =+ Dhall.Core.Code+ }+++meta :: MetaOptions -> IO ()+meta (MetaOptions {..}) = do+ putStrLn $+ "Generating defaults underneath " ++ prefix ++ "."++ for_ [ minBound .. maxBound ] $ \ defaultType -> do+ let localDest =+ defaultFile defaultType++ -- normalise for prettiness in display (otherwise we get /./ components)+ dest =+ normalise ( prefix </> localDest )++ resolve = \case+ PreludeDefault typ ->+ Expr.Embed+ ( importFile ( relativeTo localDest ( defaultFile typ ) ) )+ PreludeConstructorsLicense ->+ Expr.Constructors ( Expr.Var "types" `Expr.Field` "License" )+ PreludeConstructorsRepoKind ->+ Expr.Constructors ( Expr.Var "types" `Expr.Field` "RepoKind" )+ PreludeConstructorsScope ->+ Expr.Constructors ( Expr.Var "types" `Expr.Field` "Scope" )+ PreludeV ->+ Expr.Embed+ ( importFile ( relativeTo localDest "./Version/v.dhall" ) )++ expr :: Expr.Expr Dhall.Parser.Src Dhall.Core.Import+ expr =+ getDefault+ ( importFile ( relativeTo localDest "./types.dhall" ) )+ resolve+ defaultType++ putStrLn $+ " Writing default for " ++ show defaultType ++ " to " ++ dest ++ "."++ createDirectoryIfMissing True ( takeDirectory dest )++ System.IO.withFile dest System.IO.WriteMode $ \ hnd -> do+ System.IO.hPutStrLn hnd $+ "-- This file is auto-generated by dhall-to-cabal-meta. Look but"+ ++ " don't touch (unless you want your edits to be over-written)."+ Pretty.renderIO+ hnd+ ( Pretty.layoutSmart prettyOpts+ ( Pretty.pretty expr )+ )+++-- Shamelessly taken from dhall-format+prettyOpts :: Pretty.LayoutOptions+prettyOpts =+ Pretty.defaultLayoutOptions+ { Pretty.layoutPageWidth = Pretty.AvailablePerLine 80 1.0 }+++main :: IO ()+main = do+ metaOpts <-+ OptParse.execParser opts++ meta metaOpts++ where++ opts =+ OptParse.info ( metaOptionsParser <**> OptParse.helper ) mempty