Просмотр исходного кода

Push conversion to callers of fromUI

jherve 1 год назад
Родитель
Сommit
c60c995a9d

+ 3 - 12
src/LinkedIn/Jobs/JobOffer.purs

@@ -2,14 +2,11 @@ module LinkedIn.Jobs.JobOffer where
 
 
 import Prelude
 import Prelude
 
 
-import Data.Either (Either(..), note)
+import Data.Either (Either, note)
 import Data.Generic.Rep (class Generic)
 import Data.Generic.Rep (class Generic)
 import Data.Maybe (Maybe(..))
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
-import Data.Traversable (traverse)
-import LinkedIn.DetachedNode (DetachedNode)
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, toHeader, toPrimaryDescriptionLink, toPrimaryDescriptionText)
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, toHeader, toPrimaryDescriptionLink, toPrimaryDescriptionText)
-import LinkedIn.Profile.Utils (toUIElement)
 import LinkedIn.UIElements.Types (UIElement(..), UIString(..))
 import LinkedIn.UIElements.Types (UIElement(..), UIString(..))
 
 
 data JobOffer = JobOffer {
 data JobOffer = JobOffer {
@@ -23,14 +20,8 @@ derive instance Generic JobOffer _
 instance Show JobOffer where
 instance Show JobOffer where
   show = genericShow
   show = genericShow
 
 
-
-fromUI ∷ JobsUnifiedTopCardElement DetachedNode → Either String JobOffer
-fromUI card = fromUI' =<< case traverse toUIElement card of
-  Left _ -> Left "error on conversion to UI element"
-  Right ui -> Right ui
-
-fromUI' ∷ JobsUnifiedTopCardElement UIElement → Either String JobOffer
-fromUI' card = ado
+fromUI ∷ JobsUnifiedTopCardElement UIElement → Either String JobOffer
+fromUI card = ado
     title <- note "No title found" $ extractTitle header
     title <- note "No title found" $ extractTitle header
     companyName <- note "No company found" $ extractCompany link
     companyName <- note "No company found" $ extractCompany link
     companyLink <- note "No company link found" $ extractCompanyLink link
     companyLink <- note "No company link found" $ extractCompanyLink link

+ 2 - 1
src/LinkedIn/Page/JobOffer.purs

@@ -12,6 +12,7 @@ import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.Jobs.JobOffer (JobOffer)
 import LinkedIn.Jobs.JobOffer (JobOffer)
 import LinkedIn.Jobs.JobOffer as JJO
 import LinkedIn.Jobs.JobOffer as JJO
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, queryJobsUnifiedTopCardElement)
 import LinkedIn.JobsUnifiedTopCard (JobsUnifiedTopCardElement, queryJobsUnifiedTopCardElement)
+import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryOne)
 import LinkedIn.QueryRunner (QueryRunner', subQueryOne)
 import Web.DOM (Document, Node)
 import Web.DOM (Document, Node)
 
 
@@ -46,4 +47,4 @@ extract p = do
   detached <- traverse toDetached p
   detached <- traverse toDetached p
   let
   let
     JobOfferPage tabs = detached
     JobOfferPage tabs = detached
-  pure $ JJO.fromUI tabs
+  pure $ (JJO.fromUI <=< fromDetachedToUI) tabs

+ 2 - 1
src/LinkedIn/Page/Projects.purs

@@ -13,6 +13,7 @@ import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
 import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.Profile.Project (Project)
 import LinkedIn.Profile.Project (Project)
 import LinkedIn.Profile.Project as PP
 import LinkedIn.Profile.Project as PP
+import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
 import Web.DOM (Document, Node)
 import Web.DOM (Document, Node)
 
 
@@ -47,4 +48,4 @@ extract p = do
   detached <- traverse toDetached p
   detached <- traverse toDetached p
   let
   let
     ProjectsPage cards = detached
     ProjectsPage cards = detached
-  pure $ traverse PP.fromUI cards
+  pure $ traverse (PP.fromUI <=< fromDetachedToUI) cards

+ 2 - 1
src/LinkedIn/Page/Skills.purs

@@ -13,6 +13,7 @@ import LinkedIn.ArtDecoTab (ArtDecoTabElement, queryArtDecoTab)
 import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.Profile.Skill (Skill)
 import LinkedIn.Profile.Skill (Skill)
 import LinkedIn.Profile.Skill as PS
 import LinkedIn.Profile.Skill as PS
+import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
 import Web.DOM (Document, Node)
 import Web.DOM (Document, Node)
 
 
@@ -47,4 +48,4 @@ extract p = do
   detached <- traverse toDetached p
   detached <- traverse toDetached p
   let
   let
     SkillsPage tabs = detached
     SkillsPage tabs = detached
-  pure $ traverse PS.fromUI tabs
+  pure $ traverse (PS.fromUI <=< fromDetachedToUI) tabs

+ 2 - 1
src/LinkedIn/Page/WorkExperiences.purs

@@ -11,6 +11,7 @@ import Data.Traversable (class Traversable, sequence, traverse, traverseDefault)
 import Effect (Effect)
 import Effect (Effect)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, queryArtDecoCard)
 import LinkedIn.DetachedNode (toDetached)
 import LinkedIn.DetachedNode (toDetached)
+import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.Profile.WorkExperience (WorkExperience)
 import LinkedIn.Profile.WorkExperience (WorkExperience)
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
 import LinkedIn.QueryRunner (QueryRunner', subQueryMany)
@@ -47,4 +48,4 @@ extract p = do
   detached <- traverse toDetached p
   detached <- traverse toDetached p
   let
   let
     WorkExperiencesPage cards = detached
     WorkExperiencesPage cards = detached
-  pure $ traverse PWE.fromUI cards
+  pure $ traverse (PWE.fromUI <=< fromDetachedToUI) cards

+ 3 - 11
src/LinkedIn/Profile/Project.purs

@@ -2,15 +2,12 @@ module LinkedIn.Profile.Project where
 
 
 import Prelude
 import Prelude
 
 
-import Data.Either (Either(..), note)
+import Data.Either (Either, note)
 import Data.Generic.Rep (class Generic)
 import Data.Generic.Rep (class Generic)
 import Data.List as L
 import Data.List as L
 import Data.Maybe (Maybe(..))
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
-import Data.Traversable (traverse)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, toCenterContent, toHeaderBold, toHeaderNormal)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, toCenterContent, toHeaderBold, toHeaderNormal)
-import LinkedIn.DetachedNode (DetachedNode)
-import LinkedIn.Profile.Utils (toUIElement)
 import LinkedIn.UIElements.Types (TimeSpan, UIElement(..), UIString(..))
 import LinkedIn.UIElements.Types (TimeSpan, UIElement(..), UIString(..))
 
 
 data Project = Project {
 data Project = Project {
@@ -23,13 +20,8 @@ derive instance Generic Project _
 instance Show Project where
 instance Show Project where
   show = genericShow
   show = genericShow
 
 
-fromUI ∷ ArtDecoCardElement DetachedNode → Either String Project
-fromUI card = fromUI' =<< case traverse toUIElement card of
-  Left _ -> Left "error on conversion to UI element"
-  Right ui -> Right ui
-
-fromUI' ∷ ArtDecoCardElement UIElement → Either String Project
-fromUI' card = ado
+fromUI ∷ ArtDecoCardElement UIElement → Either String Project
+fromUI card = ado
     name <- note "No position found" $ extractName bold
     name <- note "No position found" $ extractName bold
   in
   in
     Project {
     Project {

+ 3 - 11
src/LinkedIn/Profile/Skill.purs

@@ -2,14 +2,11 @@ module LinkedIn.Profile.Skill where
 
 
 import Prelude
 import Prelude
 
 
-import Data.Either (Either(..), note)
+import Data.Either (Either, note)
 import Data.Generic.Rep (class Generic)
 import Data.Generic.Rep (class Generic)
 import Data.Maybe (Maybe(..))
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
-import Data.Traversable (traverse)
 import LinkedIn.ArtDecoTab (ArtDecoTabElement, toHeaderBold)
 import LinkedIn.ArtDecoTab (ArtDecoTabElement, toHeaderBold)
-import LinkedIn.DetachedNode (DetachedNode)
-import LinkedIn.Profile.Utils (toUIElement)
 import LinkedIn.UIElements.Types (UIElement(..), UIString(..))
 import LinkedIn.UIElements.Types (UIElement(..), UIString(..))
 
 
 data Skill = Skill {
 data Skill = Skill {
@@ -20,13 +17,8 @@ derive instance Generic Skill _
 instance Show Skill where
 instance Show Skill where
   show = genericShow
   show = genericShow
 
 
-fromUI ∷ ArtDecoTabElement DetachedNode → Either String Skill
-fromUI tab = fromUI' =<< case traverse toUIElement tab of
-  Left _ -> Left "error on conversion to UI element"
-  Right ui -> Right ui
-
-fromUI' ∷ ArtDecoTabElement UIElement → Either String Skill
-fromUI' tab = ado
+fromUI ∷ ArtDecoTabElement UIElement → Either String Skill
+fromUI tab = ado
     name <- note "No position found" $ extractName bold
     name <- note "No position found" $ extractName bold
   in
   in
     Skill { name }
     Skill { name }

+ 6 - 0
src/LinkedIn/Profile/Utils.purs

@@ -5,11 +5,17 @@ import Prelude
 import Control.Alt ((<|>))
 import Control.Alt ((<|>))
 import Data.Either (Either(..))
 import Data.Either (Either(..))
 import Data.Maybe (Maybe(..))
 import Data.Maybe (Maybe(..))
+import Data.Traversable (class Traversable, traverse)
 import LinkedIn.DetachedNode (DetachedNode(..))
 import LinkedIn.DetachedNode (DetachedNode(..))
 import LinkedIn.UIElements.Parser (uiStringP)
 import LinkedIn.UIElements.Parser (uiStringP)
 import LinkedIn.UIElements.Types (UIElement(..))
 import LinkedIn.UIElements.Types (UIElement(..))
 import Parsing (ParseError(..), initialPos, runParser)
 import Parsing (ParseError(..), initialPos, runParser)
 
 
+fromDetachedToUI ∷ ∀ t. Traversable t ⇒ t DetachedNode → Either String (t UIElement)
+fromDetachedToUI el = case traverse toUIElement el of
+  Left _ -> Left "error on conversion to UI element"
+  Right ui -> Right ui
+
 -- TODO : should certainly use another type than ParseError here
 -- TODO : should certainly use another type than ParseError here
 toUIElement ∷ DetachedNode → Either ParseError UIElement
 toUIElement ∷ DetachedNode → Either ParseError UIElement
 toUIElement (DetachedElement {content}) = wrapInUiElement content
 toUIElement (DetachedElement {content}) = wrapInUiElement content

+ 3 - 11
src/LinkedIn/Profile/WorkExperience.purs

@@ -2,16 +2,13 @@ module LinkedIn.Profile.WorkExperience where
 
 
 import Prelude
 import Prelude
 
 
-import Data.Either (Either(..), note)
+import Data.Either (Either, note)
 import Data.Foldable (findMap)
 import Data.Foldable (findMap)
 import Data.Generic.Rep (class Generic)
 import Data.Generic.Rep (class Generic)
 import Data.List as L
 import Data.List as L
 import Data.Maybe (Maybe(..))
 import Data.Maybe (Maybe(..))
 import Data.Show.Generic (genericShow)
 import Data.Show.Generic (genericShow)
-import Data.Traversable (traverse)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, toCenterContent, toHeaderBold, toHeaderLight, toHeaderNormal)
 import LinkedIn.ArtDecoCard (ArtDecoCardElement, toCenterContent, toHeaderBold, toHeaderLight, toHeaderNormal)
-import LinkedIn.DetachedNode (DetachedNode)
-import LinkedIn.Profile.Utils (toUIElement)
 import LinkedIn.UIElements.Types (Duration, TimeSpan, UIElement(..), UIString(..))
 import LinkedIn.UIElements.Types (Duration, TimeSpan, UIElement(..), UIString(..))
 
 
 data WorkExperience = WorkExperience {
 data WorkExperience = WorkExperience {
@@ -28,13 +25,8 @@ derive instance Eq WorkExperience
 instance Show WorkExperience where
 instance Show WorkExperience where
   show = genericShow
   show = genericShow
 
 
-fromUI ∷ ArtDecoCardElement DetachedNode → Either String WorkExperience
-fromUI card = fromUI' =<< case traverse toUIElement card of
-  Left _ -> Left "error on conversion to UI element"
-  Right ui -> Right ui
-
-fromUI' ∷ ArtDecoCardElement UIElement → Either String WorkExperience
-fromUI' card = ado
+fromUI ∷ ArtDecoCardElement UIElement → Either String WorkExperience
+fromUI card = ado
     position <- note "No position found" $ extractPosition bold
     position <- note "No position found" $ extractPosition bold
   in
   in
     WorkExperience {
     WorkExperience {

+ 2 - 1
test/ArtDecoCard.purs

@@ -16,6 +16,7 @@ import LinkedIn.ArtDecoCard (ArtDecoCardElement(..))
 import LinkedIn.DetachedNode (DetachedNode(..), toDetached)
 import LinkedIn.DetachedNode (DetachedNode(..), toDetached)
 import LinkedIn.Page.WorkExperiences (WorkExperiencesPage(..))
 import LinkedIn.Page.WorkExperiences (WorkExperiencesPage(..))
 import LinkedIn.Page.WorkExperiences as PageWE
 import LinkedIn.Page.WorkExperiences as PageWE
+import LinkedIn.Profile.Utils (fromDetachedToUI)
 import LinkedIn.Profile.WorkExperience (WorkExperience(..))
 import LinkedIn.Profile.WorkExperience (WorkExperience(..))
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.Profile.WorkExperience as PWE
 import LinkedIn.QueryRunner (runQuery)
 import LinkedIn.QueryRunner (runQuery)
@@ -84,7 +85,7 @@ testArtDecoCards = do
   }
   }
 
 
   assertEqual {
   assertEqual {
-    actual: PWE.fromUI headCard,
+    actual: (PWE.fromUI <=< fromDetachedToUI) headCard,
     expected:
     expected:
       Right (WorkExperience {
       Right (WorkExperience {
         company: Just "DeepLearning.AI",
         company: Just "DeepLearning.AI",