summaryrefslogtreecommitdiff
path: root/walint/Badges.hs
diff options
context:
space:
mode:
Diffstat (limited to 'walint/Badges.hs')
-rw-r--r--walint/Badges.hs64
1 files changed, 64 insertions, 0 deletions
diff --git a/walint/Badges.hs b/walint/Badges.hs
new file mode 100644
index 0000000..9af34b3
--- /dev/null
+++ b/walint/Badges.hs
@@ -0,0 +1,64 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+
+-- | module defining Badge types and utility functions
+module Badges where
+
+import Universum
+
+import Data.Aeson (Options (fieldLabelModifier, sumEncoding),
+ SumEncoding (UntaggedValue), ToJSON (toJSON),
+ defaultOptions, genericToJSON, (.=))
+import qualified Data.Aeson as A
+import Data.Char (toLower)
+import Text.Regex.TDFA ((=~))
+
+
+data BadgeArea =
+ BadgePoint
+ { areaX :: Double
+ , areaY :: Double
+ }
+ | BadgeRect
+ { areaX :: Double
+ , areaY :: Double
+ , areaWidth :: Double
+ , areaHeight :: Double
+ }
+ deriving (Ord, Eq, Generic, Show, NFData)
+
+newtype BadgeToken = BadgeToken Text
+ deriving newtype (Eq, Ord, Show, NFData)
+
+instance ToJSON BadgeArea where
+ toJSON = genericToJSON defaultOptions
+ { fieldLabelModifier = drop 4 . map toLower
+ , sumEncoding = UntaggedValue }
+
+instance ToJSON BadgeToken where
+ toJSON (BadgeToken text) = toJSON text
+
+parseToken :: Text -> Maybe BadgeToken
+parseToken text = if text =~ ("^[a-zA-Z0-9]{50}$" :: Text)
+ then Just (BadgeToken text)
+ else Nothing
+
+data Badge = Badge BadgeToken BadgeArea
+ deriving (Ord, Eq, Generic, Show, NFData)
+
+instance ToJSON Badge where
+ toJSON (Badge token area) = A.object $ case area of
+ BadgePoint x y -> [ "x" .= x
+ , "y" .= y
+ , "token" .= token
+ , "type" .= A.String "point"
+ ]
+ BadgeRect {..} -> [ "x" .= areaX
+ , "y" .= areaY
+ , "token" .= token
+ , "width" .= areaWidth
+ , "height" .= areaHeight
+ , "type" .= A.String "rectangle"
+ ]