From abf217754c08ee5f99a445bb2e22b334eb0efac1 Mon Sep 17 00:00:00 2001
From: Philipp Balzarek
Date: Sat, 13 Oct 2012 14:44:02 +0200
Subject: [PATCH] complete the basic code to work with data forms
---
source/Network/Xmpp/Xep/DataForms.hs | 85 +++++++++++++++++++++++-----
1 file changed, 71 insertions(+), 14 deletions(-)
diff --git a/source/Network/Xmpp/Xep/DataForms.hs b/source/Network/Xmpp/Xep/DataForms.hs
index 6172a1f..9491acd 100644
--- a/source/Network/Xmpp/Xep/DataForms.hs
+++ b/source/Network/Xmpp/Xep/DataForms.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE NoMonomorphismRestriction #-}
+{-# LANGUAGE TupleSections #-}
{-# LANGUAGE OverloadedStrings #-}
-- | XEP 0004: Data Forms (http://xmpp.org/extensions/xep-0004.html)
@@ -10,8 +12,14 @@ import qualified Data.XML.Types as XML
import Data.XML.Pickle
import qualified Data.Text as Text
+import qualified Text.XML.Stream.Parse as Parse
+
+dataFormNs :: Text.Text
dataFormNs = "jabber:x:data"
+dataFormName :: Text.Text -> XML.Name
+dataFormName n = XML.Name n (Just dataFormNs) Nothing
+
data FormType = FormF | SubmitF | CancelF | ResultF
instance Show FormType where
@@ -27,25 +35,27 @@ instance Read FormType where
readsPrec _ "result" = [(ResultF, "")]
readsPrec _ _ = []
-data Option = Option { label :: Text.Text
+data Option = Option { label :: Maybe Text.Text
, options :: [Text.Text]
- }
+ } deriving Show
-data Field = Field { fieldType :: FieldType
- , desc :: Maybe Text.Text
- , required :: Bool
- , value :: [Text.Text]
- , option :: [Option]
- }
+data Field = Field { fieldVar :: Maybe Text.Text
+ , fieldLabel :: Maybe Text.Text
+ , fieldType :: Maybe FieldType
+ , fieldDesc :: Maybe Text.Text
+ , fieldRequired :: Bool
+ , fieldValues :: [Text.Text]
+ , fieldOptions :: [Option]
+ } deriving Show
data Form = Form { formType :: FormType
, title :: Maybe Text.Text
- , instructions :: Maybe Text.Text
- , field :: [Field]
- }
-
-
+ , instructions :: [Text.Text]
+ , fields :: [Field]
+ , reported :: Maybe [Field]
+ , items :: [[Field]]
+ } deriving Show
data FieldType = Boolean
| Fixed
@@ -58,7 +68,6 @@ data FieldType = Boolean
| TextPrivate
| TextSingle
-
instance Show FieldType where
show Boolean = "boolean"
show Fixed = "fixed"
@@ -83,3 +92,51 @@ instance Read FieldType where
readsPrec _ "text-private" = [(TextPrivate ,"")]
readsPrec _ "text-single" = [(TextSingle ,"")]
readsPrec _ _ = []
+
+
+xpForm :: PU [XML.Node] Form
+xpForm = xpWrap (\(tp , (title, instructions, fields, reported, items)) ->
+ Form tp title (map snd instructions) fields reported (map snd items))
+ (\(Form tp title instructions fields reported items) ->
+ (tp ,
+ (title, map ((),) instructions
+ , fields, reported, map ((),) items)))
+
+ $
+ xpElem (dataFormName "x")
+ (xpAttr "type" xpPrim)
+ (xp5Tuple
+ (xpOption $ xpElemNodes (dataFormName "title") (xpContent xpId))
+ (xpElems (dataFormName "instructions") xpUnit (xpContent xpId))
+ xpFields
+ (xpOption $ xpElemNodes (dataFormName "reported") xpFields)
+ (xpElems (dataFormName "item") xpUnit xpFields))
+
+xpFields :: PU [XML.Node] [Field]
+xpFields = xpWrap (map $ \((var, tp, label),(desc, req, vals, opts))
+ -> Field var label tp desc req vals opts)
+ (map $ \(Field var label tp desc req vals opts)
+ -> ((var, tp, label),(desc, req, vals, opts))) $
+ xpElems (dataFormName "field")
+ (xp3Tuple
+ (xpAttrImplied "var" xpId )
+ (xpAttrImplied "type" xpPrim )
+ (xpAttrImplied "label" xpId )
+ )
+ (xp4Tuple
+ (xpOption $ xpElemText (dataFormName "desc"))
+ (xpElemExists (dataFormName "required"))
+ xpValues
+ xpOptions )
+
+xpValues :: PU [XML.Node] [Text.Text]
+xpValues = xpWrap (map snd) (map ((),))
+ (xpElems (dataFormName "value") xpUnit (xpContent xpId))
+
+xpOptions :: PU [XML.Node] [Option]
+xpOptions = xpWrap
+ (map $ \(l, os) -> Option l os)
+ (map $ \(Option l os) -> (l, os)) $
+ xpElems (dataFormName "option")
+ (xpAttrImplied "label" xpId)
+ xpValues