module Data.ASN1.Pretty
( pretty
, PrettyType(..)
) where
import Data.ASN1.Types
import Data.ASN1.BitArray
import Data.ByteArray.Encoding (convertToBase, Base(..))
import Data.ByteString (ByteString)
import Numeric (showHex)
data PrettyType = Multiline Int
| SingleLine
deriving (Int -> PrettyType -> ShowS
[PrettyType] -> ShowS
PrettyType -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PrettyType] -> ShowS
$cshowList :: [PrettyType] -> ShowS
show :: PrettyType -> String
$cshow :: PrettyType -> String
showsPrec :: Int -> PrettyType -> ShowS
$cshowsPrec :: Int -> PrettyType -> ShowS
Show,PrettyType -> PrettyType -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PrettyType -> PrettyType -> Bool
$c/= :: PrettyType -> PrettyType -> Bool
== :: PrettyType -> PrettyType -> Bool
$c== :: PrettyType -> PrettyType -> Bool
Eq)
pretty :: PrettyType
-> [ASN1]
-> String
pretty :: PrettyType -> [ASN1] -> String
pretty (Multiline Int
at) = Int -> [ASN1] -> String
prettyPrint Int
at
where
indent :: Int -> String
indent Int
n = forall a. Int -> a -> [a]
replicate Int
n Char
' '
prettyPrint :: Int -> [ASN1] -> String
prettyPrint Int
_ [] = String
""
prettyPrint Int
n (x :: ASN1
x@(Start ASN1ConstructionType
_) : [ASN1]
xs) = Int -> String
indent Int
n forall a. [a] -> [a] -> [a]
++ forall t. (String -> t) -> ASN1 -> t
p forall a. a -> a
id ASN1
x forall a. [a] -> [a] -> [a]
++ Int -> [ASN1] -> String
prettyPrint (Int
nforall a. Num a => a -> a -> a
+Int
1) [ASN1]
xs
prettyPrint Int
n (x :: ASN1
x@(End ASN1ConstructionType
_) : [ASN1]
xs) = Int -> String
indent (Int
nforall a. Num a => a -> a -> a
-Int
1) forall a. [a] -> [a] -> [a]
++ forall t. (String -> t) -> ASN1 -> t
p forall a. a -> a
id ASN1
x forall a. [a] -> [a] -> [a]
++ Int -> [ASN1] -> String
prettyPrint (Int
nforall a. Num a => a -> a -> a
-Int
1) [ASN1]
xs
prettyPrint Int
n (ASN1
x : [ASN1]
xs) = Int -> String
indent Int
n forall a. [a] -> [a] -> [a]
++ forall t. (String -> t) -> ASN1 -> t
p forall a. a -> a
id ASN1
x forall a. [a] -> [a] -> [a]
++ Int -> [ASN1] -> String
prettyPrint Int
n [ASN1]
xs
pretty PrettyType
SingleLine = [ASN1] -> String
prettyPrint
where
prettyPrint :: [ASN1] -> String
prettyPrint [] = String
""
prettyPrint (x :: ASN1
x@(Start ASN1ConstructionType
_) : [ASN1]
xs) = forall t. (String -> t) -> ASN1 -> t
p forall a. a -> a
id ASN1
x forall a. [a] -> [a] -> [a]
++ String
"," forall a. [a] -> [a] -> [a]
++ [ASN1] -> String
prettyPrint [ASN1]
xs
prettyPrint (x :: ASN1
x@(End ASN1ConstructionType
_) : [ASN1]
xs) = forall t. (String -> t) -> ASN1 -> t
p forall a. a -> a
id ASN1
x forall a. [a] -> [a] -> [a]
++ String
"," forall a. [a] -> [a] -> [a]
++ [ASN1] -> String
prettyPrint [ASN1]
xs
prettyPrint (ASN1
x : [ASN1]
xs) = forall t. (String -> t) -> ASN1 -> t
p forall a. a -> a
id ASN1
x forall a. [a] -> [a] -> [a]
++ String
"," forall a. [a] -> [a] -> [a]
++ [ASN1] -> String
prettyPrint [ASN1]
xs
p :: ([Char] -> t) -> ASN1 -> t
p :: forall t. (String -> t) -> ASN1 -> t
p String -> t
put (Boolean Bool
b) = String -> t
put (String
"bool: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Bool
b)
p String -> t
put (IntVal Integer
i) = String -> t
put (String
"int: " forall a. [a] -> [a] -> [a]
++ forall a. (Integral a, Show a) => a -> ShowS
showHex Integer
i String
"")
p String -> t
put (BitString BitArray
bits) = String -> t
put (String
"bitstring: " forall a. [a] -> [a] -> [a]
++ (ByteString -> String
hexdump forall a b. (a -> b) -> a -> b
$ BitArray -> ByteString
bitArrayGetData BitArray
bits))
p String -> t
put (OctetString ByteString
bs) = String -> t
put (String
"octetstring: " forall a. [a] -> [a] -> [a]
++ ByteString -> String
hexdump ByteString
bs)
p String -> t
put (ASN1
Null) = String -> t
put String
"null"
p String -> t
put (OID OID
is) = String -> t
put (String
"OID: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show OID
is)
p String -> t
put (Real Double
d) = String -> t
put (String
"real: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Double
d)
p String -> t
put (Enumerated Integer
_) = String -> t
put String
"enum"
p String -> t
put (Start ASN1ConstructionType
Sequence) = String -> t
put String
"{"
p String -> t
put (End ASN1ConstructionType
Sequence) = String -> t
put String
"}"
p String -> t
put (Start ASN1ConstructionType
Set) = String -> t
put String
"["
p String -> t
put (End ASN1ConstructionType
Set) = String -> t
put String
"]"
p String -> t
put (Start (Container ASN1Class
x Int
y)) = String -> t
put (String
"< " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ASN1Class
x forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
y)
p String -> t
put (End (Container ASN1Class
x Int
y)) = String -> t
put (String
"> " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ASN1Class
x forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
y)
p String -> t
put (ASN1String ASN1CharacterString
cs) = forall t. (String -> t) -> ASN1CharacterString -> t
putCS String -> t
put ASN1CharacterString
cs
p String -> t
put (ASN1Time ASN1TimeType
TimeUTC DateTime
time Maybe TimezoneOffset
tz) = String -> t
put (String
"utctime: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show DateTime
time forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Maybe TimezoneOffset
tz)
p String -> t
put (ASN1Time ASN1TimeType
TimeGeneralized DateTime
time Maybe TimezoneOffset
tz) = String -> t
put (String
"generalizedtime: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show DateTime
time forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Maybe TimezoneOffset
tz)
p String -> t
put (Other ASN1Class
tc Int
tn ByteString
x) = String -> t
put (String
"other(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ASN1Class
tc forall a. [a] -> [a] -> [a]
++ String
"," forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
tn forall a. [a] -> [a] -> [a]
++ String
"," forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ByteString
x forall a. [a] -> [a] -> [a]
++ String
")")
putCS :: ([Char] -> t) -> ASN1CharacterString -> t
putCS :: forall t. (String -> t) -> ASN1CharacterString -> t
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
UTF8 ByteString
t) = String -> t
put (String
"utf8string:" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ByteString
t)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
Numeric ByteString
bs) = String -> t
put (String
"numericstring:" forall a. [a] -> [a] -> [a]
++ ByteString -> String
hexdump ByteString
bs)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
Printable ByteString
t) = String -> t
put (String
"printablestring: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ByteString
t)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
T61 ByteString
bs) = String -> t
put (String
"t61string:" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ByteString
bs)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
VideoTex ByteString
bs) = String -> t
put (String
"videotexstring:" forall a. [a] -> [a] -> [a]
++ ByteString -> String
hexdump ByteString
bs)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
IA5 ByteString
bs) = String -> t
put (String
"ia5string:" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ByteString
bs)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
Graphic ByteString
bs) = String -> t
put (String
"graphicstring:" forall a. [a] -> [a] -> [a]
++ ByteString -> String
hexdump ByteString
bs)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
Visible ByteString
bs) = String -> t
put (String
"visiblestring:" forall a. [a] -> [a] -> [a]
++ ByteString -> String
hexdump ByteString
bs)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
General ByteString
bs) = String -> t
put (String
"generalstring:" forall a. [a] -> [a] -> [a]
++ ByteString -> String
hexdump ByteString
bs)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
UTF32 ByteString
t) = String -> t
put (String
"universalstring:" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ByteString
t)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
Character ByteString
bs) = String -> t
put (String
"characterstring:" forall a. [a] -> [a] -> [a]
++ ByteString -> String
hexdump ByteString
bs)
putCS String -> t
put (ASN1CharacterString ASN1StringEncoding
BMP ByteString
t) = String -> t
put (String
"bmpstring: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show ByteString
t)
hexdump :: ByteString -> String
hexdump :: ByteString -> String
hexdump ByteString
bs = forall a. Show a => a -> String
show (forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
Base -> bin -> bout
convertToBase Base
Base16 ByteString
bs :: ByteString)