diff options
author | Ben Sima <ben@bsima.me> | 2024-05-01 23:41:47 -0400 |
---|---|---|
committer | Ben Sima <ben@bsima.me> | 2024-05-09 21:38:52 -0400 |
commit | dd0bc9610cf0e6842f5d5ac67a73f2fd6f4eba2f (patch) | |
tree | 2a208df1e505bbafca1382cdd2ceb27a5185a6ee | |
parent | 2fac80aa1727a200f576f899bb325f523842c3ff (diff) |
Improve Haskell documentation and bild test
Added docs to core libraries and expanded the Example.hs test to test for all
the things I want to support in a build.
-rw-r--r-- | Biz/Bild/Deps/Haskell.nix | 1 | ||||
-rw-r--r-- | Biz/Bild/Example.hs | 38 | ||||
-rw-r--r-- | Biz/Cli.hs | 13 |
3 files changed, 50 insertions, 2 deletions
diff --git a/Biz/Bild/Deps/Haskell.nix b/Biz/Bild/Deps/Haskell.nix index 8115688..04f3a74 100644 --- a/Biz/Bild/Deps/Haskell.nix +++ b/Biz/Bild/Deps/Haskell.nix @@ -44,6 +44,7 @@ "regex-applicative" "req" "safecopy" + "saltine" "servant" "servant-auth" "servant-auth-server" diff --git a/Biz/Bild/Example.hs b/Biz/Bild/Example.hs index 87472bb..66812ba 100644 --- a/Biz/Bild/Example.hs +++ b/Biz/Bild/Example.hs @@ -1,9 +1,45 @@ +{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE NoImplicitPrelude #-} -- : out example module Biz.Bild.Example where +-- Both internal and external language dependencies are detected automatically +-- by bild, for example here we import 'Crypto.Saltine' and list 'saltine' in +-- 'Deps/Haskell.nix' to indicate that this is the package we want made +-- available to bild, which will index the external package and record its +-- modules for lookup. import Alpha +import qualified Biz.Cli as Cli +import qualified Biz.Test as Test +import qualified Crypto.Saltine as Saltine +import qualified Crypto.Saltine.Core.SecretBox as Saltine main :: IO () -main = putStrLn "Hello world" +main = Cli.main <| Cli.Plan help move test pure + +move :: Cli.Arguments -> IO () +move _ = putStrLn "Hello world" + +test :: Test.Tree +test = + Test.group + "Biz.Bild.Example" + [ Test.unit "can use saltine package" <| do + Saltine.sodiumInit + k <- Saltine.newKey + n <- Saltine.newNonce + let msg = "foobar" + let encryptedMsg = Saltine.secretbox k n <| str "foobar" + Just msg Test.@=? str </ Saltine.secretboxOpen k n encryptedMsg + ] + +help :: Cli.Docopt +help = + [Cli.docopt| +example that tests basic haskell build + +Usage: + example + example test +|] @@ -25,13 +25,24 @@ import qualified Biz.Test as Test import qualified System.Console.Docopt as Docopt import qualified System.Environment as Environment +-- | Plan is the main data structure that describes a CLI program. It's not the +-- best name, but it works. This type is parameterized with `cfg` so you can +-- load configuration from the environment and pass it into your Plan. data Plan cfg = Plan - { help :: Docopt.Docopt, + { -- | Usage info, shows when given --help + help :: Docopt.Docopt, + -- | The main function takes arguments and produces effects. Maybe it should + -- also take `cfg` as an argument? move :: Docopt.Arguments -> IO (), + -- | The test suite for the gram, invoked when 'test' is passed as the first + -- argument to the program test :: Test.Tree, + -- | Function for cleaning up any files or resources, presumably on + -- shutdown. Can be just `pure` if you have nothing to tidy. tidy :: cfg -> IO () } +-- | The entrypoint for CLI programs, use this in your own `main`. main :: Plan cfg -> IO () main Plan {..} = Environment.getArgs |