1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
-- | This module demonstrates how to handle heterogeneous structs.
-- See person_server.hs and person_client.hs for examples.
module Person where
import Network.XmlRpc.Internals
-- | Record type used to represent the struct in Haskell.
data Person = Person { name :: String, age :: Int, spouse :: Maybe String } deriving Show
-- | Converts a Person to and from a heterogeneous struct.
-- Uses the existing instance of XmlRpcType for [(String,Value)]
instance XmlRpcType Person where
toValue p = toValue $ [("name",toValue (name p)),
("age", toValue (age p))]
++ maybe [] ((:[]) . (,) "spouse" . toValue) (spouse p)
fromValue v = do
t <- fromValue v
n <- getField "name" t
a <- getField "age" t
s <- getFieldMaybe "spouse" t
return Person { name = n, age = a, spouse = s }
getType _ = TStruct
|