Bläddra i källkod

Add a specific type for JobFlexibility

jherve 1 år sedan
förälder
incheckning
fd9e18474b

+ 5 - 5
src/LinkedIn/Jobs/JobOffer.purs

@@ -8,14 +8,14 @@ import Data.Lens (findOf)
 import Data.Maybe (Maybe(..), isJust)
 import Data.Show.Generic (genericShow)
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, TopCardInsight(..), TopCardInsightContent(..), _top_to_action_buttons, _top_to_insights, toHeader, toPrimaryDescriptionLink, toPrimaryDescriptionText)
-import LinkedIn.UIElements.Types (UIElement(..), UIString(..))
+import LinkedIn.UIElements.Types (JobFlexibility, UIElement(..), UIString(..))
 
 data JobOffer = JobOffer {
   title :: String,
   companyName :: String,
   companyLink :: String,
   location :: Maybe String,
-  remote :: Maybe String,
+  flexibility :: Maybe JobFlexibility,
   companyDomain :: Maybe String,
   companySize :: Maybe String,
   hasSimplifiedApplicationProcess :: Boolean
@@ -37,7 +37,7 @@ fromUI card = ado
       companyName,
       companyLink,
       location: extractLocation primaryDescText,
-      remote: extractJobRemote =<< jobInsight,
+      flexibility: extractJobRemote =<< jobInsight,
       companyDomain: extractCompanyDomain =<< companyInsight,
       companySize: extractCompanySize =<< companyInsight,
       hasSimplifiedApplicationProcess: isJust $ extractSimplifiedApplicationProcess =<< applyButton
@@ -91,9 +91,9 @@ extractLocation = case _ of
   UIElement (UIStringDotSeparated _ (UIStringPlain str)) -> Just str
   _ -> Nothing
 
-extractJobRemote :: TopCardInsight UIElement -> Maybe String
+extractJobRemote :: TopCardInsight UIElement -> Maybe JobFlexibility
 extractJobRemote = case _ of
-  TopCardInsight {content: TopCardInsightContentSecondary {primary: (UIElement (UIStringPlain str))}} -> Just str
+  TopCardInsight {content: TopCardInsightContentSecondary {primary: (UIElement (UIStringJobFlex flex))}} -> Just flex
   _ -> Nothing
 
 extractSimplifiedApplicationProcess ∷ UIElement → Maybe Boolean

+ 17 - 2
src/LinkedIn/UIElements/Parser.purs

@@ -18,7 +18,7 @@ import Data.Maybe (Maybe(..))
 import Data.String as S
 import Data.String.CodePoints (codePointFromChar)
 import Data.Tuple (Tuple(..))
-import LinkedIn.UIElements.Types (Duration(..), MonthYear(..), MonthYearOrToday(..), TimeSpan(..), UIString(..))
+import LinkedIn.UIElements.Types (Duration(..), JobFlexibility(..), MonthYear(..), MonthYearOrToday(..), TimeSpan(..), UIString(..))
 import Parsing (Parser, ParserT, fail, liftMaybe, runParser)
 import Parsing.Combinators (choice, try)
 import Parsing.String (char, rest, string)
@@ -120,6 +120,18 @@ durationP = (try yearsMonthP) <|> (try monthsP) <|> yearsP where
 
     pure $ YearsMonth y m
 
+jobFlexP :: Parser String JobFlexibility
+jobFlexP = (try hybrid) <|> (try onSite) <|> (try fullRemote) where
+  hybrid = do
+    _ <- string("Hybride")
+    pure JobFlexHybrid
+  onSite = do
+    _ <- string("Sur site")
+    pure JobFlexOnSite
+  fullRemote = do
+    _ <- string("À distance")
+    pure JobFlexFullRemote
+
 medianDotP ∷ Parser String Char
 medianDotP = char('·') <|> char('•')
 
@@ -170,7 +182,7 @@ medianDotSeparated = do
   pure $ Tuple (S.trim a0) (S.trim a1)
 
 uiStringSingleP ∷ Parser String UIString
-uiStringSingleP = (try uiStringDurationP) <|> (try uiStringTimeSpanP) <|> uiStringPlainP
+uiStringSingleP = (try uiStringDurationP) <|> (try uiStringTimeSpanP) <|> (try uiStringJobFlexP) <|> uiStringPlainP
 
 uiStringDurationP ∷ Parser String UIString
 uiStringDurationP = UIStringDuration <$> durationP
@@ -178,5 +190,8 @@ uiStringDurationP = UIStringDuration <$> durationP
 uiStringTimeSpanP ∷ Parser String UIString
 uiStringTimeSpanP = UIStringTimeSpan <$> timeSpanP
 
+uiStringJobFlexP ∷ Parser String UIString
+uiStringJobFlexP = UIStringJobFlex <$> jobFlexP
+
 uiStringPlainP ∷ Parser String UIString
 uiStringPlainP = UIStringPlain <$> rest

+ 8 - 0
src/LinkedIn/UIElements/Types.purs

@@ -35,9 +35,17 @@ derive instance Generic Duration _
 instance Show Duration where
   show = genericShow
 
+data JobFlexibility = JobFlexHybrid | JobFlexOnSite | JobFlexFullRemote
+
+derive instance Eq JobFlexibility
+derive instance Generic JobFlexibility _
+instance Show JobFlexibility where
+  show = genericShow
+
 data UIString =
   UIStringDuration Duration
   | UIStringTimeSpan TimeSpan
+  | UIStringJobFlex JobFlexibility
   | UIStringPlain String
   | UIStringDotSeparated UIString UIString
 

+ 2 - 1
test/JobsUnifiedTopCard.purs

@@ -17,6 +17,7 @@ import LinkedIn.Page.JobOffer (JobOfferPage(..))
 import LinkedIn.Page.JobOffer as PageJO
 import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (runQuery)
+import LinkedIn.UIElements.Types (JobFlexibility(..))
 import Node.JsDom (jsDomFromFile)
 import Partial.Unsafe (unsafePartial)
 import Test.Assert (assert, assertEqual)
@@ -142,7 +143,7 @@ main = do
         companySize: (Just "201-500 employés"),
         hasSimplifiedApplicationProcess: true,
         location: (Just "Boulogne-Billancourt, Île-de-France, France"),
-        remote: (Just "Sur site"),
+        flexibility: (Just JobFlexOnSite),
         title: "Data Engineer H/F - Secteur Energie"
       })
   }