PageUrl.purs 2.5 KB

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