Browse Source

Use CanBeQueried.query' everywhere it can replace Extractible.query

jherve 1 year ago
parent
commit
a02ae4c2d8

+ 4 - 2
src/LinkedIn.purs

@@ -12,6 +12,7 @@ import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable)
 import Effect (Effect)
+import LinkedIn.CanBeQueried (class CanBeQueried)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Output (OutputError, run, toOutput)
 import LinkedIn.Output.Types (Output)
@@ -62,10 +63,11 @@ encodeToJson = encodeJson
 -- | Force extraction of data from a page, when the context given by the URL is imprecise
 -- | or plain wrong (e.g. for local files).
 -- | Can be call e.g. `forceExtract (Proxy :: Proxy JobOfferPage) dom`
-forceExtract ∷ ∀ t.
+forceExtract ∷ ∀ root t.
   Traversable t
+  ⇒ CanBeQueried root t
   ⇒ Extractible t
   ⇒ Proxy t
-  → Document
+  → root
   → Effect (Either OutputError Output)
 forceExtract p = runExceptT <<< run p

+ 9 - 6
src/LinkedIn/Output.purs

@@ -5,6 +5,8 @@ import Prelude
 import Control.Monad.Except (ExceptT, except, lift, throwError, withExceptT)
 import Data.Traversable (class Traversable, traverse)
 import Effect (Effect)
+import LinkedIn.CanBeQueried (class CanBeQueried)
+import LinkedIn.CanBeQueried as CBQ
 import LinkedIn.DetachedNode (DetachedNode, toDetached)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Extractible as LE
@@ -20,25 +22,26 @@ import Parsing (parseErrorMessage)
 import Type.Proxy (Proxy(..))
 import Web.DOM (Document)
 
-run :: forall t.
+run :: forall root t.
   Traversable t
+  => CanBeQueried root t
   => Extractible t
   => Proxy t
-  -> Document
+  -> root
   -> ExceptT OutputError Effect Output
 run prox dom = do
   detached <- withExceptT (\err -> ErrorOnDetach err) $ runToDetached prox dom
   asUI <- withExceptT (\err -> ErrorOnUIConversion $ parseErrorMessage err) $ except $ traverse toUIElement detached
   withExceptT (\err -> ErrorOnExtract err) $ except $ LE.extract asUI
 
-runToDetached :: forall t.
+runToDetached :: forall root t.
   Traversable t
-  => Extractible t
+  => CanBeQueried root t
   => Proxy t
-  -> Document
+  -> root
   -> ExceptT QueryError Effect (t DetachedNode)
 runToDetached _ dom = do
-  qRes <- LE.query @t dom
+  qRes <- CBQ.query' dom
   lift $ traverse toDetached qRes
 
 toOutput ∷ PageUrl → (Document → ExceptT OutputError Effect Output)

+ 7 - 0
src/LinkedIn/Page/JobOffer.purs

@@ -6,11 +6,13 @@ import Data.Foldable (class Foldable, foldMap, foldlDefault, foldrDefault)
 import Data.Generic.Rep (class Generic)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverseDefault)
+import LinkedIn.CanBeQueried (class CanBeQueried)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Jobs.JobOffer as JJO
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.QueryRunner (subQueryOne)
 import LinkedIn.UI.Components.JobsUnifiedTopCard (JobsUnifiedTopCardElement, queryJobsUnifiedTopCardElement)
+import Web.DOM (Document)
 
 data JobOfferPage a = JobOfferPage (JobsUnifiedTopCardElement a)
 
@@ -33,6 +35,11 @@ instance Traversable JobOfferPage where
 
   traverse = \x -> traverseDefault x
 
+instance CanBeQueried Document JobOfferPage where
+  query' n = do
+    card <- subQueryOne queryJobsUnifiedTopCardElement "div.jobs-unified-top-card" n
+    pure $ JobOfferPage card
+
 instance Extractible JobOfferPage where
   query n = do
     card <- subQueryOne queryJobsUnifiedTopCardElement "div.jobs-unified-top-card" n

+ 6 - 0
src/LinkedIn/Page/Projects.purs

@@ -8,6 +8,7 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
+import LinkedIn.CanBeQueried (class CanBeQueried)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.Profile.Project (Project)
@@ -39,6 +40,11 @@ instance Traversable ProjectsPage where
   traverse = \x -> traverseDefault x
 
 
+instance CanBeQueried Document ProjectsPage where
+  query' n = do
+    cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
+    pure $ ProjectsPage cards
+
 instance Extractible ProjectsPage where
   query n = do
     cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n

+ 7 - 0
src/LinkedIn/Page/Skills.purs

@@ -7,11 +7,13 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
+import LinkedIn.CanBeQueried (class CanBeQueried)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.Profile.Skill as PS
 import LinkedIn.QueryRunner (subQueryMany)
 import LinkedIn.UI.Components.ArtDecoTab (ArtDecoTabElement, queryArtDecoTab)
+import Web.DOM (Document)
 
 data SkillsPage a = SkillsPage (NonEmptyList (ArtDecoTabElement a))
 
@@ -34,6 +36,11 @@ instance Traversable SkillsPage where
 
   traverse = \x -> traverseDefault x
 
+instance CanBeQueried Document SkillsPage where
+  query' n = do
+    tabs <- subQueryMany queryArtDecoTab "div.artdeco-tabs > div > div > div > div > ul > li" n
+    pure $ SkillsPage tabs
+
 instance Extractible SkillsPage where
   query n = do
     tabs <- subQueryMany queryArtDecoTab "div.artdeco-tabs > div > div > div > div > ul > li" n

+ 7 - 0
src/LinkedIn/Page/WorkExperiences.purs

@@ -7,11 +7,13 @@ import Data.Generic.Rep (class Generic)
 import Data.List.Types (NonEmptyList)
 import Data.Show.Generic (genericShow)
 import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
+import LinkedIn.CanBeQueried (class CanBeQueried)
 import LinkedIn.Extractible (class Extractible)
 import LinkedIn.Output.Types (Output(..))
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.QueryRunner (subQueryMany)
 import LinkedIn.UI.Components.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
+import Web.DOM (Document)
 
 data WorkExperiencesPage a = WorkExperiencesPage (NonEmptyList (ArtDecoCardElement a))
 
@@ -34,6 +36,11 @@ instance Traversable WorkExperiencesPage where
 
   traverse = \x -> traverseDefault x
 
+instance CanBeQueried Document WorkExperiencesPage where
+  query' n = do
+    cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n
+    pure $ WorkExperiencesPage cards
+
 instance Extractible WorkExperiencesPage where
   query n = do
     cards <- subQueryMany queryArtDecoCard "section.artdeco-card > div ~ div > div > div > ul > li" n