PageUrl.purs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. module LinkedIn.PageUrl (PageUrl(..), pageUrlP) where
  2. import Prelude
  3. import Control.Alt ((<|>))
  4. import Data.Argonaut.Encode (class EncodeJson)
  5. import Data.Argonaut.Encode.Generic (genericEncodeJson)
  6. import Data.Generic.Rep (class Generic)
  7. import Data.Int64 as I64
  8. import Data.Maybe (Maybe(..))
  9. import Data.Show.Generic (genericShow)
  10. import Data.String (codePointFromChar)
  11. import LinkedIn.UI.Basic.Types (JobOfferId(..))
  12. import Parsing (Parser, fail)
  13. import Parsing.Combinators (try)
  14. import Parsing.String (char, string)
  15. import Parsing.String.Basic (takeWhile)
  16. data PageUrl =
  17. UrlProfileMain String
  18. | UrlProjects String
  19. | UrlSkills String
  20. | UrlWorkExperience String
  21. | UrlEducation String
  22. | UrlLanguage String
  23. | UrlJobOffer JobOfferId
  24. derive instance Eq PageUrl
  25. derive instance Generic PageUrl _
  26. instance Show PageUrl where
  27. show = genericShow
  28. instance EncodeJson PageUrl where
  29. encodeJson a = genericEncodeJson a
  30. pathComponentP :: String -> Parser String Unit
  31. pathComponentP s = do
  32. _ <- char('/')
  33. _ <- string(s)
  34. pure unit
  35. unknownPathComponentP ∷ Parser String String
  36. unknownPathComponentP = do
  37. _ <- char('/')
  38. takeWhile (\c -> c /= codePointFromChar '/')
  39. profileMainP ∷ Parser String PageUrl
  40. profileMainP = do
  41. _ <- pathComponentP("in")
  42. name <- unknownPathComponentP
  43. pure $ UrlProfileMain name
  44. detailsP ∷ String -> Parser String String
  45. detailsP s = do
  46. _ <- pathComponentP("in")
  47. name <- unknownPathComponentP
  48. _ <- pathComponentP("details")
  49. _ <- pathComponentP(s)
  50. _ <- char('/')
  51. pure name
  52. projectP ∷ Parser String PageUrl
  53. projectP = do
  54. name <- detailsP("projects")
  55. pure $ UrlProjects name
  56. skillsP ∷ Parser String PageUrl
  57. skillsP = do
  58. name <- detailsP("skills")
  59. pure $ UrlSkills name
  60. workExperienceP ∷ Parser String PageUrl
  61. workExperienceP = do
  62. name <- detailsP("experience")
  63. pure $ UrlWorkExperience name
  64. educationP ∷ Parser String PageUrl
  65. educationP = do
  66. name <- detailsP("education")
  67. pure $ UrlEducation name
  68. languagesP ∷ Parser String PageUrl
  69. languagesP = do
  70. name <- detailsP("languages")
  71. pure $ UrlLanguage name
  72. jobViewP :: Parser String PageUrl
  73. jobViewP = do
  74. _ <- pathComponentP("jobs")
  75. _ <- pathComponentP("view")
  76. id <- unknownPathComponentP
  77. case I64.fromString id of
  78. Nothing -> fail "Not an int"
  79. Just i -> pure $ UrlJobOffer (JobOfferId i)
  80. pageUrlP ∷ Parser String PageUrl
  81. pageUrlP = try projectP
  82. <|> try skillsP
  83. <|> try workExperienceP
  84. <|> try educationP
  85. <|> try languagesP
  86. <|> try profileMainP
  87. <|> try jobViewP