diff --git a/src/serra/helpers.go b/src/serra/helpers.go index 42c0f27..b8ed865 100644 --- a/src/serra/helpers.go +++ b/src/serra/helpers.go @@ -52,6 +52,25 @@ func stringToTime(s primitive.DateTime) string { return time.UnixMilli(int64(s)).Format("2006-01-02") } +// missing compares two slices and returns slice of differences +func missing(a, b []string) []string { + type void struct{} + // create map with length of the 'a' slice + ma := make(map[string]void, len(a)) + diffs := []string{} + // Convert first slice to map with empty struct (0 bytes) + for _, ka := range a { + ma[ka] = void{} + } + // find missing values in a + for _, kb := range b { + if _, ok := ma[kb]; !ok { + diffs = append(diffs, kb) + } + } + return diffs +} + func find_set_by_code(coll *Collection, setcode string) (*Set, error) { stored_sets, err := coll.storage_find_set(bson.D{{"code", setcode}}, bson.D{{"_id", 1}}) diff --git a/src/serra/root.go b/src/serra/root.go index 30e4d44..75e6486 100644 --- a/src/serra/root.go +++ b/src/serra/root.go @@ -180,33 +180,27 @@ func Missing(setname string) error { set := sets[0] LogMessage(fmt.Sprintf("Missing cards in %s", sets[0].Name), "green") + + // generate set with all setnumbers + var complete_set []string var i int64 - // iterate over all cards in set - for i = 1; i < set.CardCount; i++ { - fmt.Printf("Checking usg/%d\n", i) - var found bool - found = false + for i = 1; i <= set.CardCount; i++ { + complete_set = append(complete_set, strconv.FormatInt(i, 10)) + } - // iterate over all cards in collection - for _, c := range cards { - found = false - // check if current card has collector number that we look for - if c.CollectorNumber == strconv.FormatInt(i, 16) { + // iterate over all cards in collection + var in_collection []string + for _, c := range cards { + in_collection = append(in_collection, c.CollectorNumber) + } - // if yes, set found to true, and stop looking - found = true - break - } + misses := missing(in_collection, complete_set) + for _, m := range misses { + ncard, err := fetch_card(fmt.Sprintf("%s/%s", setname, m)) + if err != nil { + continue } - if !found { - ncard, err := fetch_card(fmt.Sprintf("%s/%s", setname, strconv.FormatInt(i, 16))) - if err != nil { - continue - } - - fmt.Printf("%s (%s)\n", ncard.Name, ncard.SetName) - } - + fmt.Printf("%s (%s)\n", ncard.Name, ncard.SetName) } return nil }