Compare commits

...

2 commits

Author SHA1 Message Date
3cd99e3f0b Add 'doctest' as a cabal test
We provide a simple wrapper that executes `doctest` on our `src`
directory. This allows us to run all doctests during a regular `cabal
test` run.
2023-08-29 23:28:49 +02:00
8b1755425c Implement utility functions to deal with the user
- getTerminalSize -> returns the dimensions of the terminal
- getUserCommand -> returns input from the user. We currently support
- ``NextPage`` and `Quit`.

Implement getTerminalSize via 'tput'
2023-08-29 23:27:18 +02:00
4 changed files with 57 additions and 7 deletions

View file

@ -70,12 +70,12 @@
haskellPackages.haskell-language-server
haskellPackages.fourmolu
haskellPackages.hspec-discover
haskellPackages.doctest
cabal-install
ghcid
nixfmt
hpack
hlint
haskellPackages.doctest
];
};
});

View file

@ -50,6 +50,25 @@ executable hcat
, hcat
default-language: GHC2021
test-suite doctest
type: exitcode-stdio-1.0
main-is: Doctest.hs
other-modules:
Paths_hcat
hs-source-dirs:
test/doctest
default-extensions:
BlockArguments
OverloadedStrings
ImportQualifiedPost
ghc-options: -Wall -fdefer-typed-holes
build-tool-depends:
doctest:doctest
build-depends:
base >=4.13 && <5
, process
default-language: Haskell2010
test-suite spec
type: exitcode-stdio-1.0
main-is: Spec.hs

View file

@ -56,9 +56,10 @@ tests:
build-tools: hspec-discover
verbatim:
default-language: GHC2021
# doctest:
# main: Doctest.hs
# source-dirs:
# - test/doctest
# dependencies:
# - process
doctest:
main: Doctest.hs
source-dirs:
- test/doctest
dependencies:
- process
build-tools: doctest

View file

@ -4,6 +4,10 @@ module HCat.Internal where
import Data.Text (Text)
import Data.Text qualified as T
import System.IO
import System.Info qualified as SysInfo
import System.Process qualified as P
-- | @parseArgs@ takes a list of strings and returns a single FilePath if there was exactly one element.
--
-- >>> parseArgs ["foo"]
@ -67,3 +71,29 @@ paginate (ScreenDimensions rows cols) =
type Pages = [Page]
type Page = Text
getTerminalSize :: IO ScreenDimensions
getTerminalSize = case SysInfo.os of
"linux" -> tputScreenDimensions
"darwin" -> tputScreenDimensions
_ -> pure $ defaultScreenDimensions{screenRows = 25, screenColumns = 80}
defaultScreenDimensions :: ScreenDimensions
defaultScreenDimensions = ScreenDimensions{screenRows = 25, screenColumns = 80}
tputScreenDimensions :: IO ScreenDimensions
tputScreenDimensions = ScreenDimensions <$> tput "lines" <*> tput "cols"
where
tput cmd = read <$> P.readProcess "tput" [cmd] ""
data UserCommand = NextPage | Quit deriving (Show)
getUserCommand :: IO UserCommand
getUserCommand = do
hSetBuffering stdin NoBuffering
hSetEcho stdin False
input <- getChar
case input of
' ' -> pure NextPage
'q' -> pure Quit
_ -> getUserCommand