Skip to content

Commit

Permalink
Add error return value to data provider interface
Browse files Browse the repository at this point in the history
  • Loading branch information
karashiiro committed Mar 13, 2021
1 parent 82c3f62 commit a322bc6
Show file tree
Hide file tree
Showing 9 changed files with 84 additions and 58 deletions.
4 changes: 2 additions & 2 deletions achievement.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ func (s *Scraper) buildAchievementCollector(aai *AllAchievementInfo, output chan
NamedEntity: &models.NamedEntity{},
}

achievement := s.dataProvider.Achievement(name)
if achievement != nil {
achievement, err := s.dataProvider.Achievement(name)
if err == nil {
nextAchievement.NamedEntity = achievement
}

Expand Down
55 changes: 31 additions & 24 deletions character.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,19 @@ func (s *Scraper) buildCharacterCollector(
gcName := values[0]
gcRank := gcrank.Parse(values[1])

gc := s.dataProvider.GrandCompany(gcName)

charData.GrandCompanyInfo = &GrandCompanyInfo{GrandCompany: gc, RankID: gcRank}
gc, err := s.dataProvider.GrandCompany(gcName)
if err == nil {
charData.GrandCompanyInfo = &GrandCompanyInfo{GrandCompany: gc, RankID: gcRank}
}
})

charData.GuardianDeity = &IconedNamedEntity{}
c.OnHTML(charSelectors.GuardianDeity.Name.Selector, func(e *colly.HTMLElement) {
name := charSelectors.GuardianDeity.Name.Parse(e)[0]
d := s.dataProvider.Deity(name)
charData.GuardianDeity.NamedEntity = d
d, err := s.dataProvider.Deity(name)
if err == nil {
charData.GuardianDeity.NamedEntity = d
}
})
c.OnHTML(charSelectors.GuardianDeity.Icon.Selector, func(e *colly.HTMLElement) {
charData.GuardianDeity.Icon = charSelectors.GuardianDeity.Icon.Parse(e)[0]
Expand Down Expand Up @@ -88,11 +91,15 @@ func (s *Scraper) buildCharacterCollector(
// Miqo'te fix
raceName := strings.ReplaceAll(values[0], "'", "'")

r := s.dataProvider.Race(raceName)
charData.Race = r
r, err := s.dataProvider.Race(raceName)
if err == nil {
charData.Race = r
}

t := s.dataProvider.Tribe(values[1])
charData.Tribe = t
t, err := s.dataProvider.Tribe(values[1])
if err == nil {
charData.Tribe = t
}

charData.Gender = gender.Parse(values[2])
})
Expand All @@ -106,8 +113,7 @@ func (s *Scraper) buildCharacterCollector(

c.OnHTML(charSelectors.Title.Selector, func(e *colly.HTMLElement) {
titleText := charSelectors.Title.Parse(e)[0]
t := s.dataProvider.Title(titleText)

t, _ := s.dataProvider.Title(titleText)
if t != nil {
charData.Title = &Title{
TitleInternal: t,
Expand Down Expand Up @@ -137,9 +143,10 @@ func (s *Scraper) buildCharacterCollector(
charData.Town = &IconedNamedEntity{}
c.OnHTML(charSelectors.Town.Name.Selector, func(e *colly.HTMLElement) {
name := charSelectors.Town.Name.Parse(e)[0]
t := s.dataProvider.Town(name)

charData.Town.NamedEntity = t
t, err := s.dataProvider.Town(name)
if err == nil {
charData.Town.NamedEntity = t
}
})
c.OnHTML(charSelectors.Town.Icon.Selector, func(e *colly.HTMLElement) {
charData.Town.Icon = charSelectors.Town.Icon.Parse(e)[0]
Expand Down Expand Up @@ -253,8 +260,8 @@ func (s *Scraper) buildCharacterCollector(
})
c.OnHTML(currSelector.Stain.Selector, func(e *colly.HTMLElement) {
name := currSelector.Stain.Parse(e)[0]
item := s.dataProvider.Item(name)
if item != nil {
item, err := s.dataProvider.Item(name)
if err == nil {
currRef.Dye = item.ID
}
})
Expand All @@ -266,8 +273,8 @@ func (s *Scraper) buildCharacterCollector(
name = name[0 : len(name)-3]
}

item := s.dataProvider.Item(name)
if item != nil {
item, err := s.dataProvider.Item(name)
if err == nil {
currRef.NamedEntity = item
}
})
Expand All @@ -282,8 +289,8 @@ func (s *Scraper) buildCharacterCollector(
for _, materiaSelector := range materiaSelectors {
materiaCallback := func(e *colly.HTMLElement) {
name := materiaSelector.ParseInnerHTML(e)[0]
item := s.dataProvider.Item(name)
if item != nil {
item, err := s.dataProvider.Item(name)
if err == nil {
currRef.Materia = append(currRef.Materia, item.ID)
}
}
Expand All @@ -292,17 +299,17 @@ func (s *Scraper) buildCharacterCollector(

c.OnHTML(currSelector.MirageName.Selector, func(e *colly.HTMLElement) {
name := currSelector.MirageName.Parse(e)[0]
item := s.dataProvider.Item(name)
if item != nil {
item, err := s.dataProvider.Item(name)
if err == nil {
currRef.Mirage = item.ID
}
})
}

c.OnHTML(partSelectors.SoulCrystal.Name.Selector, func(e *colly.HTMLElement) {
name := partSelectors.SoulCrystal.Name.Parse(e)[0]
item := s.dataProvider.Item(name)
if item != nil {
item, err := s.dataProvider.Item(name)
if err == nil {
partRefs.SoulCrystal.NamedEntity = item
}
})
Expand Down
18 changes: 12 additions & 6 deletions classjob.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,18 +94,24 @@ func (s *Scraper) buildClassJobCollector(charData *Character) *colly.Collector {

curCj.IsSpecialized = strings.Contains(e.Attr("class"), "meister")

jobInfo := s.dataProvider.ClassJob(names[0])
curCj.JobID = uint8(jobInfo.ID)
jobInfo, err := s.dataProvider.ClassJob(names[0])
if err == nil {
curCj.JobID = uint8(jobInfo.ID)
}

if len(names) > 1 {
classInfo := s.dataProvider.ClassJob(names[1])
curCj.ClassID = uint8(classInfo.ID)
classInfo, err := s.dataProvider.ClassJob(names[1])
if err == nil {
curCj.ClassID = uint8(classInfo.ID)
}
} else {
curCj.ClassID = uint8(curCj.JobID)
}

cjInfo := s.dataProvider.ClassJob(curCj.UnlockedState.Name)
curCj.UnlockedState.ID = uint8(cjInfo.ID)
cjInfo, err := s.dataProvider.ClassJob(curCj.UnlockedState.Name)
if err == nil {
curCj.UnlockedState.ID = uint8(cjInfo.ID)
}
})

charData.ClassJobs = append(charData.ClassJobs, &curCj)
Expand Down
12 changes: 8 additions & 4 deletions freecompany.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,10 @@ func (s *Scraper) buildFreeCompanyCollector(fc *FreeCompany) *colly.Collector {
rep := &FreeCompanyReputation{}
c.OnHTML(curRep.Name.Selector, func(e *colly.HTMLElement) {
gcName := curRep.Name.Parse(e)[0]
gc := s.dataProvider.GrandCompany(gcName)
rep.GrandCompany = gc
gc, err := s.dataProvider.GrandCompany(gcName)
if err == nil {
rep.GrandCompany = gc
}
})
c.OnHTML(curRep.Progress.Selector, func(e *colly.HTMLElement) {
progressStr := curRep.Progress.Parse(e)[0]
Expand All @@ -193,8 +195,10 @@ func (s *Scraper) buildFreeCompanyCollector(fc *FreeCompany) *colly.Collector {
})
c.OnHTML(curRep.Rank.Selector, func(e *colly.HTMLElement) {
repName := curRep.Rank.Parse(e)[0]
r := s.dataProvider.Reputation(repName)
rep.Rank = r
r, err := s.dataProvider.Reputation(repName)
if err == nil {
rep.Rank = r
}
})

fc.Reputation = append(fc.Reputation, rep)
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ github.com/karashiiro/bingode v1.0.1 h1:zWZYkSDf4FYgncNZDyJIueQ5stE6EDbNogXJKJ9v
github.com/karashiiro/bingode v1.0.1/go.mod h1:lzVTRMIEwNzxD46MOfDskypTi+zBu9QGrklE4cG+tLo=
github.com/karashiiro/bingode v1.0.2 h1:0Ml10cqICBMWlwPSNf7YlTw6C0CpxDmeAf3BydrVlLc=
github.com/karashiiro/bingode v1.0.2/go.mod h1:KvajV1nOhqF6CZyJZzPk3m7Pmt+4loFSdjLrEc/cBXY=
github.com/karashiiro/bingode v1.1.0 h1:EF3XULVRYyF/BhmnzpvUknYnTukibHtILwV7CY0XnVY=
github.com/karashiiro/bingode v1.1.0/go.mod h1:KvajV1nOhqF6CZyJZzPk3m7Pmt+4loFSdjLrEc/cBXY=
github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
Expand Down
4 changes: 2 additions & 2 deletions mimo.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func (s *Scraper) buildMinionCollector(output chan *Minion) *colly.Collector {
name := minionSelectors.Minions.Name.ParseThroughChildren(e)[0]
icon := minionSelectors.Minions.Icon.ParseThroughChildren(e)[0]

m := s.dataProvider.Minion(name)
m, _ := s.dataProvider.Minion(name)
if m == nil {
output <- &Minion{
IconedNamedEntity: &IconedNamedEntity{
Expand Down Expand Up @@ -60,7 +60,7 @@ func (s *Scraper) buildMountCollector(output chan *Mount) *colly.Collector {
name := mountSelectors.Mounts.Name.ParseThroughChildren(e)[0]
icon := mountSelectors.Mounts.Icon.ParseThroughChildren(e)[0]

m := s.dataProvider.Mount(name)
m, _ := s.dataProvider.Mount(name)
if m == nil {
output <- &Mount{
IconedNamedEntity: &IconedNamedEntity{
Expand Down
24 changes: 12 additions & 12 deletions provider/data-provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ import "github.com/xivapi/godestone/v2/provider/models"
// DataProvider represents a service implementation responsible for
// converting our scraped data into a useful form.
type DataProvider interface {
Achievement(name string) *models.NamedEntity
ClassJob(name string) *models.NamedEntity
Deity(name string) *models.NamedEntity
GrandCompany(name string) *models.NamedEntity
Item(name string) *models.NamedEntity
Minion(name string) *models.NamedEntity
Mount(name string) *models.NamedEntity
Race(name string) *models.GenderedEntity
Reputation(name string) *models.NamedEntity
Title(name string) *models.TitleInternal
Town(name string) *models.NamedEntity
Tribe(name string) *models.GenderedEntity
Achievement(name string) (*models.NamedEntity, error)
ClassJob(name string) (*models.NamedEntity, error)
Deity(name string) (*models.NamedEntity, error)
GrandCompany(name string) (*models.NamedEntity, error)
Item(name string) (*models.NamedEntity, error)
Minion(name string) (*models.NamedEntity, error)
Mount(name string) (*models.NamedEntity, error)
Race(name string) (*models.GenderedEntity, error)
Reputation(name string) (*models.NamedEntity, error)
Title(name string) (*models.TitleInternal, error)
Town(name string) (*models.NamedEntity, error)
Tribe(name string) (*models.GenderedEntity, error)
}
18 changes: 12 additions & 6 deletions search-options.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,18 +57,24 @@ func (s *CharacterOptions) BuildURI(
if s.Tribe != "" || s.Race != "" {
raceTribe := ""
if s.Tribe != "" {
t := scraper.dataProvider.Tribe(s.Tribe)
raceTribe = fmt.Sprintf("tribe_%d", t.ID)
t, err := scraper.dataProvider.Tribe(s.Tribe)
if err == nil {
raceTribe = fmt.Sprintf("tribe_%d", t.ID)
}
} else if s.Race != "" {
r := scraper.dataProvider.Race(s.Race)
raceTribe = fmt.Sprintf("race_%d", r.ID)
r, err := scraper.dataProvider.Race(s.Race)
if err == nil {
raceTribe = fmt.Sprintf("race_%d", r.ID)
}
}
uriFormat += fmt.Sprintf("&race_tribe=%s", raceTribe)
}

if s.GrandCompany != "" {
gc := scraper.dataProvider.GrandCompany(s.GrandCompany)
uriFormat += fmt.Sprintf("&gcid=%d", gc.ID)
gc, err := scraper.dataProvider.GrandCompany(s.GrandCompany)
if err == nil {
uriFormat += fmt.Sprintf("&gcid=%d", gc.ID)
}
}

builtURI := fmt.Sprintf(uriFormat, lang, name, worldDC, "", s.Order)
Expand Down
6 changes: 4 additions & 2 deletions search.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,10 @@ func (s *Scraper) buildFreeCompanySearchCollector(
}

gcName := entrySelectors.GrandCompany.ParseThroughChildren(e)[0]
gc := s.dataProvider.GrandCompany(gcName)
nextFC.GrandCompany = gc
gc, err := s.dataProvider.GrandCompany(gcName)
if err == nil {
nextFC.GrandCompany = gc
}

server := entrySelectors.Server.ParseThroughChildren(e)
nextFC.World = server[0]
Expand Down

0 comments on commit a322bc6

Please sign in to comment.