packages feed

Fungi-1.0.2: Text/Help/Fungi.hs

module Text.Help.Fungi (
    help
  ) where

import Data.ByteSize (byteSize)
import Data.Char (chr, toLower)
import Data.Int
import Data.List (sort, intercalate, nub)
import qualified Data.Map as Map
import Data.Maybe (fromMaybe)

import System.Environment (getProgName)
import System.FilePath (dropExtension)

import Text.PrintOption

import Fingerprint

-----------------------------------------------------------

p :: Char -> String -> String -> IO ()
p = printOption

b :: Char -> String -> String -> IO ()
b = printOptionWith defaultPrintSettings { bulletDelim = Just "***" }

supportedSizes :: String
supportedSizes = intercalate ", " $ map show $ sort $ nub $ map (fromMaybe 0) [
    byteSize (0 :: Integer)
  , byteSize (0 :: Int)
  , byteSize (0 :: Int8)
  , byteSize (0 :: Int16)
  , byteSize (0 :: Int32)
  , byteSize (0 :: Int64)
  ]

fingers :: String
fingers = intercalate ", " $ sort $ map (reverse . decode) $ Map.keys (fingerprints :: Fingerprints Integer)
  where
    decode x = if x == 0
      then ""
      else chr (fromInteger m) : decode d
      where
        (d, m) = x `divMod` 256

line :: IO ()
line = putStrLn $ replicate 80 '-'

help :: IO ()
help = do
  line
  progName <- fmap (map toLower . dropExtension) getProgName
  putStrLn $ "Usage: " ++ progName ++ " [OPTIONS] [PROGRAM FILE] [PROGRAM ARGS]"
  line
  putStrLn $ "Options:"
  p '?' "help" "Display this help message."
  b 'd' "debug [MODE=1]" $ concat [
      "Run program using debugger."
    , "***MODE=1,on,true: Run debugger in step mode."
    , "***MODE=0,off,false: Run without debugger."
    , "\nDefault is off."
    ]
  p 's' "cell-size SIZE" $ concat [
      "Set the funge cell byte size to SIZE.\n"
    , "Supported sizes are " ++ supportedSizes ++ ".\n"
    , "If SIZE <= 0 then cell size is unbounded.\n"
    , "Default is " ++ show (fromMaybe 0 $ byteSize (0 :: Int)) ++ "."
    ]
  b 'n' "dim DIM" $ concat [
      "Set the funge dimensions to DIM."
    , "\nDefault depends on file extension:"
    , "***uf u98: 1"
    , "***bf b98: 2"
    , "***tf t98: 3"
    , "\nAll other extensions default to 2."
    , "\nAllowed values: 0 < DIM <= " ++ show (maxBound :: Int) ++ "."
    ]
  b 'u' "unknown MODE" $ concat [
      "What to do when encountering an unknown instruction."
    , "***MODE=reverse: Reverse on unknown instruction."
    , "***MODE=debug: Launch debugger on unknown instruction. Instruction reverses."
    , "***MODE=fail: Terminate program on unknown instruction."
    , "\nDefault is reverse."
    ]
  line
  p ' ' "FINGERPRINTS--" fingers
  line