From b1c110bccef6705b8bb15798d10fcbd508004b55 Mon Sep 17 00:00:00 2001 From: Shuhei Kubota Date: Mon, 19 Dec 2022 18:17:18 +0900 Subject: [PATCH] feat: prioritize --columns by exact/wildcard/empty exact: --columns sheet1!col1:number wildcard --columns sheet1!col*:number --columns sheet*:col1:number empty: --columns col1:number 1. column is exact, sheet is exact 2. column is exact, sheet is wildcard 3. column is exact, sheet is empty 4. column is wildcard, sheet is exact 5. column is wildcard, sheet is wildcard 6. column is wildcard, sheet is empty --- column.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/column.go b/column.go index c38cfd3..5942297 100644 --- a/column.go +++ b/column.go @@ -1,6 +1,7 @@ package main import ( + "path/filepath" "strings" ) @@ -15,6 +16,7 @@ type column struct { } func newColumn(s string, typ colType, format string) column { + s = strings.ToLower(s) c := column{Sheet: "", Name: s, Type: typ, InputFormat: format} if pos := strings.Index(s, "!"); pos != -1 { c.Sheet = s[:pos] @@ -28,14 +30,47 @@ func (cc columns) findByName(sheet, name string) int { return -1 } - for i := range cc { - if strings.EqualFold(cc[i].Sheet, sheet) && strings.EqualFold(cc[i].Name, name) { + sheet = strings.ToLower(sheet) + name = strings.ToLower(name) + + // name:exact, sheet:exact + for i, c := range cc { + if strings.EqualFold(c.Name, name) && strings.EqualFold(c.Sheet, sheet) { + return i + } + } + + // name:exact, sheet:wildcard + for i, c := range cc { + if strings.EqualFold(c.Name, name) && wildcardMatch(c.Sheet, sheet) { return i } } - for i := range cc { - if strings.EqualFold(cc[i].Sheet, "") && strings.EqualFold(cc[i].Name, name) { + // name:exact, sheet:empty + for i, c := range cc { + if strings.EqualFold(c.Name, name) && strings.EqualFold(c.Sheet, "") { + return i + } + } + + // name:wildcard, sheet:exact + for i, c := range cc { + if wildcardMatch(c.Name, name) && strings.EqualFold(c.Sheet, sheet) { + return i + } + } + + // name:wildcard, sheet:wildcard + for i, c := range cc { + if wildcardMatch(c.Name, name) && wildcardMatch(c.Sheet, sheet) { + return i + } + } + + // name:wildcard, sheet:empty + for i, c := range cc { + if wildcardMatch(c.Name, name) && strings.EqualFold(c.Sheet, "") { return i } } @@ -43,6 +78,16 @@ func (cc columns) findByName(sheet, name string) int { return -1 } +func wildcardMatch(pattern, name string) bool { + if pattern == "*" { + return true + } + if matched, _ := filepath.Match(pattern, name); matched { + return true + } + return false +} + type colType string const (