github.com/jacekolszak/noteo@v0.5.0/tag/tag.go (about) 1 package tag 2 3 import ( 4 "fmt" 5 "regexp" 6 "strconv" 7 "strings" 8 "time" 9 10 "github.com/jacekolszak/noteo/date" 11 ) 12 13 var validName = regexp.MustCompile(`^\S+$`) 14 15 func New(name string) (Tag, error) { 16 if !validName.MatchString(name) { 17 return Tag{}, fmt.Errorf("%s is not a valid tag", name) 18 } 19 return Tag{tag: name}, nil 20 } 21 22 type Tag struct { 23 tag string 24 } 25 26 func (t Tag) Name() string { 27 s := t.tag 28 if strings.Contains(s, ":") { 29 return s[:strings.Index(s, ":")] 30 } 31 return s 32 } 33 34 func (t Tag) Value() (string, error) { 35 s := t.tag 36 if !strings.Contains(s, ":") { 37 return "", fmt.Errorf("tag %s is not name:value", t) 38 } 39 val := s[strings.Index(s, ":")+1:] 40 return val, nil 41 } 42 43 func (t Tag) Number() (int, error) { 44 value, err := t.Value() 45 if err != nil { 46 return 0, err 47 } 48 return parseNumber(value) 49 } 50 51 func parseNumber(value string) (int, error) { 52 num, err := strconv.ParseInt(value, 10, 32) 53 return int(num), err 54 } 55 56 func (t Tag) AbsoluteDate() (time.Time, error) { 57 value, err := t.Value() 58 if err != nil { 59 return time.Time{}, err 60 } 61 return date.ParseAbsolute(value) 62 } 63 64 func (t Tag) RelativeDate() (time.Time, error) { 65 value, err := t.Value() 66 if err != nil { 67 return time.Time{}, err 68 } 69 return date.Parse(value) 70 } 71 72 func (t Tag) MakeDateAbsolute() (Tag, error) { 73 relativeDate, err := t.RelativeDate() 74 if err != nil { 75 return t, err 76 } 77 if relativeDate.Hour() == 0 && relativeDate.Minute() == 0 && relativeDate.Second() == 0 && relativeDate.Nanosecond() == 0 { 78 return Tag{ 79 tag: t.Name() + ":" + relativeDate.Format("2006-01-02"), 80 }, nil 81 } 82 return Tag{ 83 tag: t.Name() + ":" + relativeDate.Format(time.RFC3339), 84 }, nil 85 } 86 87 func (t Tag) String() string { 88 return t.tag 89 }