Skip to content

Commit

Permalink
feat: prioritize --columns by exact/wildcard/empty
Browse files Browse the repository at this point in the history
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
  • Loading branch information
ShuheiKubota committed Dec 19, 2022
1 parent aa81920 commit b1c110b
Showing 1 changed file with 49 additions and 4 deletions.
53 changes: 49 additions & 4 deletions column.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"path/filepath"
"strings"
)

Expand All @@ -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]
Expand All @@ -28,21 +30,64 @@ 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
}
}

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 (
Expand Down

0 comments on commit b1c110b

Please sign in to comment.