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 Logo = [String]
logo :: Bool -> (String -> [String]) -> Logo
logo :: Bool -> (String -> [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 ()
displayLogo :: Bool -> Bool -> REPL ()
displayLogo 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
]