Utils.purs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. module LinkedIn.Profile.Utils where
  2. import Prelude
  3. import Control.Alt ((<|>))
  4. import Data.Either (Either(..))
  5. import Data.Maybe (Maybe(..))
  6. import Data.Traversable (class Traversable, traverse)
  7. import LinkedIn.DetachedNode (DetachedNode(..))
  8. import LinkedIn.UIElements.Parser (uiStringP)
  9. import LinkedIn.UIElements.Types (UIElement(..))
  10. import Parsing (ParseError(..), initialPos, runParser)
  11. fromDetachedToUI ∷ ∀ t. Traversable t ⇒ t DetachedNode → Either String (t UIElement)
  12. fromDetachedToUI el = case traverse toUIElement el of
  13. Left _ -> Left "error on conversion to UI element"
  14. Right ui -> Right ui
  15. -- TODO : should certainly use another type than ParseError here
  16. toUIElement ∷ DetachedNode → Either ParseError UIElement
  17. toUIElement (DetachedElement {content}) = wrapInUiElement content
  18. toUIElement (DetachedComment str) = wrapInUiElement str
  19. toUIElement (DetachedText str) = wrapInUiElement str
  20. toUIElement (DetachedSvgElement {id, dataTestIcon, tag: "svg"}) = case id <|> dataTestIcon of
  21. Just i -> Right (UIIcon i)
  22. Nothing -> Left (ParseError "SVG element could not be identified" initialPos)
  23. toUIElement (DetachedSvgElement _) = Left (ParseError "SVG element could not be identified" initialPos)
  24. toUIElement (DetachedLiIcon i) = Right (UIIcon i)
  25. toUIElement (DetachedButton {content, role}) = map toButton $ runParser content uiStringP
  26. where toButton ui = UIButton role ui
  27. toUIElement (DetachedA {content, href}) = map toLink $ runParser content uiStringP
  28. where toLink ui = UILink href ui
  29. wrapInUiElement ∷ String → Either ParseError UIElement
  30. wrapInUiElement string = map UIElement $ runParser string uiStringP