0 | module Text.Molfile.SData
2 | import Data.ByteString
3 | import Derive.Prelude
4 | import Derive.Refined
5 | import public Data.Nat
6 | import public Data.String
7 | import public Data.Refined
8 | import public Data.Refined.Integer
9 | import public Data.Refined.String
12 | %language ElabReflection
15 | IsHeaderChar : Char -> Bool
16 | IsHeaderChar '>' = False
17 | IsHeaderChar '<' = False
18 | IsHeaderChar c = not (isControl c)
21 | 0 IsHeader : String -> Type
22 | IsHeader = Len (<= 70) && Str (All $
Holds IsHeaderChar)
26 | record SDHeader where
29 | {auto 0 prf : IsHeader value}
32 | Interpolation SDHeader where
36 | %runElab derive "SDHeader" [Show,Eq,Ord,RefinedString]
39 | readHeader : ByteString -> SDHeader
41 | case break (60 ==) bs of
44 | fromMaybe "" $
refineSDHeader (toString . BV.takeWhile (62 /=) $
tail bv)
49 | encodeHeader : String -> Maybe SDHeader
50 | encodeHeader = refineSDHeader . convert [<] . unpack
52 | convert : SnocList Char -> List Char -> String
53 | convert sc [] = pack $
sc <>> []
54 | convert sc (' '::t) = convert (sc :< '_') t
56 | if isAlphaNum h then convert (sc:<h) t else convert sc t
59 | 0 IsValue : String -> Type
60 | IsValue = Str (All Printable)
66 | record SDValue where
69 | {auto 0 prf : IsValue value}
72 | Interpolation SDValue where
76 | %runElab derive "SDValue" [Show,Eq,Ord,RefinedString]
80 | record StructureData where
85 | %runElab derive "StructureData" [Show,Eq]
94 | encodeStructureData : (name,value : String) -> Maybe StructureData
95 | encodeStructureData n v = [| SD (encodeHeader n) (refineSDValue v) |]