{-# LANGUAGE UndecidableInstances #-}
module Data.Type.BitRecords.Structure.String
( FixSizeStringStructure
, utf8Bits
)
where
import qualified Language.Haskell.TH as TH
import qualified Language.Haskell.TH.Quote as TH
import GHC.TypeLits
import Data.Type.Pretty
import qualified Data.ByteString as B
import qualified Data.Text as T
import qualified Data.Text.Encoding as E
import Data.Proxy
import Data.Kind.Extra
import Data.Type.BitRecords.Structure
data FixSizeStringStructure :: Nat -> Extends (Structure 'FixSize)
type instance GetStructureSize (FixSizeStringStructure size) = size
type instance PrettyStructure (FixSizeStringStructure size) =
"FixSizeStringStructure" <:> PutNat size <++> PutStr "bits"
utf8Bits :: TH.QuasiQuoter
utf8Bits = TH.QuasiQuoter undefined undefined mkSizedStr undefined
where
mkSizedStr :: String -> TH.Q TH.Type
mkSizedStr str = do
let strT = TH.LitT (TH.StrTyLit str)
byteCount = fromIntegral (B.length (E.encodeUtf8 (T.pack str)))
byteCountT = TH.LitT (TH.NumTyLit byteCount)
return $ TH.PromotedT ''FixSizeStringStructure `TH.AppT` strT `TH.AppT` byteCountT