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  }