aboutsummaryrefslogtreecommitdiffstats
path: root/skate/zippy.go
diff options
context:
space:
mode:
Diffstat (limited to 'skate/zippy.go')
-rw-r--r--skate/zippy.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/skate/zippy.go b/skate/zippy.go
index 6034351..4d3aa04 100644
--- a/skate/zippy.go
+++ b/skate/zippy.go
@@ -200,6 +200,57 @@ func ZippyVerifyRefsOpenLibraryTable(olr, refs io.Reader, w io.Writer) error {
return zipper.Run()
}
+// ZippyVerifyRefsOpenLibrary takes OL editions (as release) and refs (as
+// release) and emits a match table for manual inspection.
+func ZippyVerifyRefsOpenLibrary(olr, refs io.Reader, w io.Writer) error {
+ var (
+ enc = json.NewEncoder(w)
+ keyer = makeKeyFunc("\t", 1)
+ grouper = func(g *zipkey.Group) error {
+ var (
+ ref, pivot *Release // ref (reference), pivot (open library)
+ err error
+ )
+ if len(g.G0) == 0 || len(g.G1) == 0 {
+ return nil
+ }
+ // We take a single edition from OL.
+ if pivot, err = stringToRelease(Cut(g.G0[0], 2)); err != nil {
+ return err
+ }
+ for _, line := range g.G1 {
+ if ref, err = stringToRelease(Cut(line, 2)); err != nil {
+ return err
+ }
+ // The refs have a container name, but not a title, but here we
+ // compare against titles from open library.
+ result := Verify(pivot, ref)
+ switch result.Status {
+ case StatusExact, StatusStrong:
+ var bref BiblioRef
+ bref.SourceReleaseIdent = ref.Ident
+ bref.SourceWorkIdent = ref.WorkID
+ bref.SourceReleaseStage = ref.ReleaseStage
+ bref.SourceYear = fmt.Sprintf("%d", ref.ReleaseYear())
+ bref.RefIndex = ref.Extra.Skate.Ref.Index + 1 // we want 1-index (also helps with omitempty)
+ bref.RefKey = ref.Extra.Skate.Ref.Key
+ bref.TargetOpenLibraryWork = pivot.WorkID
+ bref.MatchProvenance = ref.Extra.Skate.Ref.Source
+ bref.MatchStatus = result.Status.Short()
+ bref.MatchReason = result.Reason.Short()
+ if err := enc.Encode(bref); err != nil {
+ return err
+ }
+ default:
+ }
+ }
+ return nil
+ }
+ )
+ zipper := zipkey.New(olr, refs, keyer, grouper)
+ return zipper.Run()
+}
+
// Cut returns a specific column (1-indexed, like CutSep) from a tabular
// file, returns empty string if column is invalid.
func Cut(line string, column int) string {