aboutsummaryrefslogtreecommitdiff
path: root/src/server/Model/Message/Parts.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/Model/Message/Parts.hs')
-rw-r--r--src/server/Model/Message/Parts.hs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/server/Model/Message/Parts.hs b/src/server/Model/Message/Parts.hs
new file mode 100644
index 0000000..b7855f8
--- /dev/null
+++ b/src/server/Model/Message/Parts.hs
@@ -0,0 +1,38 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Model.Message.Parts
+ ( replaceParts
+ , getParts
+ ) where
+
+import Data.Maybe (listToMaybe, fromMaybe)
+import Data.Text (Text)
+import qualified Data.Text as T
+
+import Text.ParserCombinators.Parsec
+
+replaceParts :: [Text] -> [Part] -> Text
+replaceParts values = T.concat . map (replacePart values)
+
+replacePart :: [Text] -> Part -> Text
+replacePart _ (Str str) = str
+replacePart values (Num n) =
+ fromMaybe (T.concat ["{", T.pack (show n), "}"]) . listToMaybe . drop (n - 1) $ values
+
+data Part =
+ Num Int
+ | Str Text
+
+getParts :: Text -> [Part]
+getParts str =
+ case parse partsParser "" (T.unpack str) of
+ Right parts -> parts
+ Left _ -> []
+
+partsParser :: Parser [Part]
+partsParser = many partParser
+
+partParser :: Parser Part
+partParser =
+ (do _ <- string "{"; n <- read <$> many1 digit; _ <- string "}"; return (Num n))
+ <|> (do str <- T.pack <$> many1 (noneOf "{"); return (Str str))