Parser.purs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. module LinkedIn.UI.Strings.Parser where
  2. import Prelude
  3. import Control.Alt ((<|>))
  4. import Data.Either (hush)
  5. import Data.Traversable (traverse)
  6. import LinkedIn.UI.Basic.Parser (durationP, jobFlexP, medianDotSeparated, timeSpanP)
  7. import LinkedIn.UI.Strings.Types (UIString(..))
  8. import Parsing (Parser, liftMaybe, runParser)
  9. import Parsing.Combinators (try)
  10. import Parsing.String (rest)
  11. uiStringP :: Parser String UIString
  12. uiStringP = (try uiStringdotSeparatedP) <|> uiStringSingleP
  13. uiStringWithoutMedianDotP ∷ Parser String UIString
  14. uiStringWithoutMedianDotP = do
  15. s <- rest
  16. liftMaybe (\_ -> "nope") $ hush $ runParser s uiStringSingleP
  17. uiStringdotSeparatedP ∷ Parser String UIString
  18. uiStringdotSeparatedP = do
  19. stringsNel <- medianDotSeparated
  20. let
  21. intoUiElement :: String -> Parser String UIString
  22. intoUiElement s = liftMaybe (\_ -> "could not convert to ui element") $ hush $ runParser s uiStringSingleP
  23. stringsNel' <- traverse intoUiElement stringsNel
  24. pure $ UIStringDotSeparated stringsNel'
  25. uiStringSingleP ∷ Parser String UIString
  26. uiStringSingleP = (try uiStringDurationP) <|> (try uiStringTimeSpanP) <|> (try uiStringJobFlexP) <|> uiStringPlainP
  27. uiStringDurationP ∷ Parser String UIString
  28. uiStringDurationP = UIStringDuration <$> durationP
  29. uiStringTimeSpanP ∷ Parser String UIString
  30. uiStringTimeSpanP = UIStringTimeSpan <$> timeSpanP
  31. uiStringJobFlexP ∷ Parser String UIString
  32. uiStringJobFlexP = UIStringJobFlex <$> jobFlexP
  33. uiStringPlainP ∷ Parser String UIString
  34. uiStringPlainP = UIStringPlain <$> rest