-- |
-- Module      :  REPL.Logo
-- Copyright   :  (c) 2013-2016 Galois, Inc.
-- License     :  BSD3
-- Maintainer  :  cryptol@galois.com
-- Stability   :  provisional
-- Portability :  portable

module REPL.Logo where

import Cryptol.REPL.Monad
import Cryptol.Utils.Panic (panic)
import Paths_cryptol (version)

import Cryptol.Version (commitShortHash,commitDirty)
import Data.Version (showVersion)
import System.Console.ANSI
import Prelude ()
import Prelude.Compat


type Version = String

type  = [String]

-- | The list of 'String's returned by the @mk@ function should be non-empty.
logo :: Bool -> (String -> [String]) -> Logo
 Bool
useColor String -> [String]
mk =
     [ [SGR] -> String
sgr [ConsoleLayer -> ColorIntensity -> Color -> SGR
SetColor ConsoleLayer
Foreground ColorIntensity
Dull  Color
White] String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
l | String
l <- [String]
ws ]
  [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [ [SGR] -> String
sgr [ConsoleLayer -> ColorIntensity -> Color -> SGR
SetColor ConsoleLayer
Foreground ColorIntensity
Vivid Color
Blue ] String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
l | String
l <- [String]
vs ]
  [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [ [SGR] -> String
sgr [ConsoleLayer -> ColorIntensity -> Color -> SGR
SetColor ConsoleLayer
Foreground ColorIntensity
Dull  Color
Blue ] String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
l | String
l <- [String]
ds ]
  [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [ [SGR] -> String
sgr [SGR
Reset] ]
  where
  sgr :: [SGR] -> String
sgr | Bool
useColor  = [SGR] -> String
setSGRCode
      | Bool
otherwise = String -> [SGR] -> String
forall a b. a -> b -> a
const []
  hashText :: String
hashText | String
commitShortHash String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"UNKNOWN" = String
""
           | Bool
otherwise = String
" (" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
commitShortHash String -> String -> String
forall a. [a] -> [a] -> [a]
++
                                 (if Bool
commitDirty then String
", modified)" else String
")")
  versionText :: String
versionText = String
"version " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Version -> String
showVersion Version
version String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
hashText
  ver :: String
ver = [SGR] -> String
sgr [ConsoleLayer -> ColorIntensity -> Color -> SGR
SetColor ConsoleLayer
Foreground ColorIntensity
Dull Color
White]
        String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> Char -> String
forall a. Int -> a -> [a]
replicate (Int
lineLen Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
20 Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
versionText) Char
' '
        String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
versionText String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n"
        String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"https://cryptol.net  :? for help"
  ls :: [String]
ls        = String -> [String]
mk String
ver
  slen :: Int
slen      = [String] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
ls Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
3
  ([String]
ws,[String]
rest) = Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
slen [String]
ls
  ([String]
vs,[String]
ds)   = Int -> [String] -> ([String], [String])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
slen [String]
rest
  line :: String
line      = case [String]
ls of
                String
line':[String]
_ -> String
line'
                [] -> String -> [String] -> String
forall a. HasCallStack => String -> [String] -> a
panic String
"logo" [String
"empty lines"]
  lineLen :: Int
lineLen   = String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
line

displayLogo :: Bool -> Bool -> REPL ()
 Bool
useColor Bool
useUnicode =
  REPL () -> REPL ()
unlessBatch (IO () -> REPL ()
forall a. IO a -> REPL a
io ((String -> IO ()) -> [String] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ String -> IO ()
putStrLn (Bool -> (String -> [String]) -> [String]
logo Bool
useColor (if Bool
useUnicode then String -> [String]
logo2 else String -> [String]
logo1))))

logo1 :: String -> [String]
logo1 :: String -> [String]
logo1 String
ver =
    [ String
"                        _        _"
    , String
"   ___ _ __ _   _ _ __ | |_ ___ | |"
    , String
"  / __| \'__| | | | \'_ \\| __/ _ \\| |"
    , String
" | (__| |  | |_| | |_) | || (_) | |"
    , String
"  \\___|_|   \\__, | .__/ \\__\\___/|_|"
    , String
"            |___/|_| " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
ver
    ]

logo2 :: String -> [String]
logo2 :: String -> [String]
logo2 String
ver =
    [ String
"┏━╸┏━┓╻ ╻┏━┓╺┳╸┏━┓╻  "
    , String
"┃  ┣┳┛┗┳┛┣━┛ ┃ ┃ ┃┃  "
    , String
"┗━╸╹┗╸ ╹ ╹   ╹ ┗━┛┗━╸"
    , String
ver
    ]