From 749e19458a8f96e215e3af36d2656621ab6a0ffd Mon Sep 17 00:00:00 2001 From: Jeremy Jay Date: Fri, 12 Feb 2021 00:59:01 -0500 Subject: [PATCH] allow openers to have a priority --- cmd/{xls2tsv => grate2tsv}/main.go | 0 grate.go | 21 ++++++++++++++------- xls/xls.go | 2 +- xlsx/xlsx.go | 2 +- 4 files changed, 16 insertions(+), 9 deletions(-) rename cmd/{xls2tsv => grate2tsv}/main.go (100%) diff --git a/cmd/xls2tsv/main.go b/cmd/grate2tsv/main.go similarity index 100% rename from cmd/xls2tsv/main.go rename to cmd/grate2tsv/main.go diff --git a/grate.go b/grate.go index 9484933..91b8c61 100644 --- a/grate.go +++ b/grate.go @@ -4,6 +4,7 @@ package grate import ( "errors" + "sort" ) // Source represents a set of data collections. @@ -26,7 +27,7 @@ var ErrNotInFormat = errors.New("grate: file is not in this format") // Open a tabular data file and return a Source for accessing it's contents. func Open(filename string) (Source, error) { for _, o := range srcTable { - src, err := o(filename) + src, err := o.op(filename) if err == nil { return src, nil } @@ -37,14 +38,20 @@ func Open(filename string) (Source, error) { return nil, errors.New("grate: file format is not known/supported") } -var srcTable = make(map[string]OpenFunc) +type srcOpenTab struct { + name string + pri int + op OpenFunc +} + +var srcTable = make([]*srcOpenTab, 0, 20) // Register the named source as a grate datasource implementation. -func Register(name string, opener OpenFunc) error { - if _, ok := srcTable[name]; ok { - return errors.New("grate: source already registered") - } - srcTable[name] = opener +func Register(name string, priority int, opener OpenFunc) error { + srcTable = append(srcTable, &srcOpenTab{name: name, pri: priority, op: opener}) + sort.Slice(srcTable, func(i, j int) bool { + return srcTable[i].pri < srcTable[j].pri + }) return nil } diff --git a/xls/xls.go b/xls/xls.go index aeff80c..2730418 100644 --- a/xls/xls.go +++ b/xls/xls.go @@ -20,7 +20,7 @@ import ( "github.com/pbnjay/grate/xls/crypto" ) -var _ = grate.Register("xls", Open) +var _ = grate.Register("xls", 1, Open) type WorkBook struct { filename string diff --git a/xlsx/xlsx.go b/xlsx/xlsx.go index fb88964..5ec820e 100644 --- a/xlsx/xlsx.go +++ b/xlsx/xlsx.go @@ -13,7 +13,7 @@ import ( "github.com/pbnjay/grate/commonxl" ) -var _ = grate.Register("xlsx", Open) +var _ = grate.Register("xlsx", 5, Open) // Document contains an Office Open XML document. type Document struct {