{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Main where
import qualified Data.ByteString as ByteString
import qualified Data.Serialize as Cereal
import Data.Serialize.Text ()
import Domain
import DomainCereal
import Prelude
declare
Nothing
(serializeDeriver <> genericDeriver <> eqDeriver)
[schema|
ServiceAddress:
sum:
network: NetworkAddress
local: FilePath
NetworkAddress:
product:
protocol: TransportProtocol
host: Host
port: Word16
TransportProtocol:
enum:
- tcp
- udp
Host:
sum:
ip: Ip
name: Text
Ip:
sum:
v4: Word32
v6: Word128
Word128:
product:
part1: Word64
part2: Word64
|]
main :: IO ()
main = do
let value =
NetworkServiceAddress $
NetworkAddress
TcpTransportProtocol
(IpHost (V4Ip 123))
456
let encoded = Cereal.encode value
putStrLn $ "Encoded size: " <> show (ByteString.length encoded)
case Cereal.decode encoded of
Left err -> fail err
Right res ->
if value == res
then putStrLn "Success! Decoded value does equal the original"
else fail "Failure! Decoded valued doesn't equal the original"