diff --git a/default.nix b/default.nix index 8e64348..260d36a 100644 --- a/default.nix +++ b/default.nix @@ -1,17 +1,19 @@ - let - nix-pre-commit-hooks = import (builtins.fetchTarball "https://github.com/cachix/pre-commit-hooks.nix/tarball/master"); - in { - pre-commit-check = nix-pre-commit-hooks.run { - src = ./.; - hooks = { - ormolu = { - enable = true; - excludes = [".circleci/golden"]; - }; - hlint = { - enable = true; - excludes = [".circleci/golden"]; - }; - }; - }; - } +let + nix-pre-commit-hooks = import (builtins.fetchTarball "https://github.com/cachix/pre-commit-hooks.nix/tarball/master"); +in +{ + pre-commit-check = nix-pre-commit-hooks.run { + src = ./.; + hooks = { + ormolu = { + enable = true; + excludes = [ ".circleci/golden" ]; + }; + hlint = { + enable = true; + excludes = [ ".circleci/golden" ]; + }; + nixpkgs-fmt.enable = true; + }; + }; +} diff --git a/nix/example-client.nix b/nix/example-client.nix new file mode 100644 index 0000000..6a4ae03 --- /dev/null +++ b/nix/example-client.nix @@ -0,0 +1,16 @@ +(import ./pkgs.nix).generateOpenAPIClient +{ + name = "stripe-api"; + src = ../.circleci/specifications/stripe-api.yml; + packageName = "stripe-api"; + moduleName = "StripeAPI"; + extraFlags = [ + "--property-type-suffix=\"'\"" + "--convert-to-camel-case" + ]; + operations = [ + "GetEvents" + "GetCustomers" + "PostCheckoutSessions" + ]; +} diff --git a/nix/generate-client.nix b/nix/generate-client.nix new file mode 100644 index 0000000..0485b0d --- /dev/null +++ b/nix/generate-client.nix @@ -0,0 +1,47 @@ +{ pkgs ? import ./pkgs.nix +}: +{ name +, src +, packageName ? name +, moduleName +, extraFlags ? [ ] +, operations ? [ ] # Empty list means "All operations" +}: + +with pkgs.lib; +with pkgs.haskell.lib; +let + localPkgs = import ./pkgs.nix; + extraFlagsStr = concatStringsSep " " extraFlags; + operationFlag = operation: "--operation-to-generate '${operation}'"; + operationsFlags = optionalString (operations != [ ]) '' + --omit-additional-operation-functions ${concatStringsSep " " (map operationFlag operations)} + ''; + generatedCode = pkgs.stdenv.mkDerivation { + name = "generated-${name}"; + buildInputs = [ + localPkgs.haskellPackages.openapi3-code-generator + ]; + buildCommand = '' + # To make sure that we don't get issues with encodings + export LANG=C.utf8 + export LC_ALL=C.utf8 + + set -x + + openapi3-code-generator-exe ${src} \ + --module-name "${moduleName}" \ + --package-name "${packageName}" \ + --output-dir "$out" \ + ${extraFlagsStr} \ + ${operationsFlags} + + set +x + ''; + }; + generatedPackage = dontHaddock (disableLibraryProfiling (pkgs.haskellPackages.callCabal2nix name generatedCode { })); +in +{ + code = generatedCode; + package = generatedPackage; +} diff --git a/nix/gitignore-src.nix b/nix/gitignore-src.nix new file mode 100644 index 0000000..b78c485 --- /dev/null +++ b/nix/gitignore-src.nix @@ -0,0 +1,13 @@ +final: previous: +let + gitignoreSrc = + final.fetchFromGitHub { + owner = "hercules-ci"; + repo = "gitignore.nix"; + rev = "c4662e662462e7bf3c2a968483478a665d00e717"; + sha256 = "sha256:1npnx0h6bd0d7ql93ka7azhj40zgjp815fw2r6smg8ch9p7mzdlx"; + }; +in +{ + inherit (import gitignoreSrc { inherit (final) lib; }) gitignoreSource; +} diff --git a/nix/nixpkgs-version.nix b/nix/nixpkgs-version.nix new file mode 100644 index 0000000..962613e --- /dev/null +++ b/nix/nixpkgs-version.nix @@ -0,0 +1,4 @@ +{ + rev = "e3a2247046d4de66b9b193a6ab3ff040fa3da86d"; + sha256 = "sha256:0gnpspk2lhwjfmkim416az7q3p5rjbc7q5pvhq23j4gbgkhs0q6i"; +} diff --git a/nix/nixpkgs.nix b/nix/nixpkgs.nix new file mode 100644 index 0000000..b001688 --- /dev/null +++ b/nix/nixpkgs.nix @@ -0,0 +1,8 @@ +let + nixpkgsVersion = import ./nixpkgs-version.nix; +in +builtins.fetchTarball { + url = + "https://github.com/NixOS/nixpkgs/archive/$%7BnixpkgsVersion.rev%7D.tar.gz"; + inherit (nixpkgsVersion) sha256; +} diff --git a/nix/overlay.nix b/nix/overlay.nix new file mode 100644 index 0000000..6657a91 --- /dev/null +++ b/nix/overlay.nix @@ -0,0 +1,29 @@ +final: previous: +with final.lib; +with final.haskell.lib; +let +in +{ + generateOpenAPIClient = import ./generate-client.nix { pkgs = final; }; + haskellPackages = + previous.haskellPackages.override ( + old: + { + overrides = + final.lib.composeExtensions + ( + old.overrides or ( + _: + _: + { } + ) + ) + ( + self: super: + { + openapi3-code-generator = final.haskellPackages.callCabal2nix "openapi3-code-generator" (final.gitignoreSource ../.) { }; + } + ); + } + ); +} diff --git a/nix/pkgs.nix b/nix/pkgs.nix new file mode 100644 index 0000000..45e9301 --- /dev/null +++ b/nix/pkgs.nix @@ -0,0 +1,13 @@ +let + pkgsv = import (import ./nixpkgs.nix); + pkgs = pkgsv { }; + ourPkgs = + pkgsv { + overlays = + [ + (import ./gitignore-src.nix) + (import ./overlay.nix) + ]; + }; +in +ourPkgs